API リファレンス

REST API & ScamDB APIでChainAnalyzerをシステムに統合

REST APIアクセスにはPro以上のプランが必要です。ScamDB読み取りは無料です。

認証

REST APIリクエストにはtfk_プレフィックスのAPIキーが必要です。ダッシュボードの「設定」→「API Keys」から作成できます(1アカウント最大5本・作成時に1度だけ全文表示)。

X-API-Keyヘッダーで送信:

curl -H "X-API-Key: tfk_your_key_here" \
     https://chain-analyzer.com/api/v1/public/scan

ベースURL

https://chain-analyzer.com/api/v1

OpenAPI 仕様

全エンドポイントの機械可読な定義(OpenAPI 3.1)。Postman / Insomnia / コード生成ツールにそのまま読み込めます。

curl https://chain-analyzer.com/openapi-enterprise.json

スコアの規約

risk_score は 0(安全)〜 100(危険)で、値が大きいほどリスクが高い。この規約は単発スキャン・バッチ結果・スキャン履歴・Webhook ペイロードで統一されています。履歴・バッチ系のレスポンスには score_semantics: "risk_0to100" が付くので、クライアント側で規約をアサートできます。

chain の識別子は bitcoin / ethereum / polygon / bsc / base / arbitrum / optimism / avalanche / kaia / solana / tron / xrp。BNB Smart Chain は bsc です(bnb は 400)。省略するとアドレス形式から自動判定します。

PATCH メソッドに対応しています(Webhook 設定・Follow Mode・ケース/ケースアドレスの部分更新)。

クイックスタート: 15分でVASP連携

入金の受け入れ判定から継続監視まで、実運用のコアループを4ステップで通します。すべて curl でそのまま実行できます(tfk_your_key_here を自分のキーに差し替えてください)。

ステップ1: 入金を受け入れる前にアドレスをスクリーニングする

2段構えにします。ホットパスでは GET /public/presign/check で即座に verdict を得て、ok 以外のときだけ POST /public/scan のフルスキャンに落とします。例は TRON の USDT 入金です(token_contract = TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t)。

① 高速レーン — 毎トランザクション呼んで構いません(クォータ消費 0・専用レート枠・約120秒キャッシュ)

curl -H "X-API-Key: tfk_your_key_here" \
  "https://chain-analyzer.com/api/v1/public/presign/check?chain=tron&to=TAUN6FwrnwwmaEqYcckffC7wYmbaS6cBiX"
{
  "level": "low",
  "verdict": "ok",
  "score": 5,
  "reasons": [],
  "signals": { "sanctioned": false, "scamdb_hit": false },
  "confidence": 0.9,
  "chain": "tron",
  "to": "TAUN6FwrnwwmaEqYcckffC7wYmbaS6cBiX",
  "latency_ms": 41,
  "cached": false
}

verdict は ok / caution / danger の3値で、UI のバナー状態にそのまま対応します。level は critical / high / medium / low / unknown(未対応チェーンも unknown)、score は 0〜100 で大きいほど危険です。

② フルスキャン — verdict が ok 以外のときだけ(1スキャン消費)

curl -X POST https://chain-analyzer.com/api/v1/public/scan \
  -H "X-API-Key: tfk_your_key_here" -H "Content-Type: application/json" \
  -d '{"address":"TAUN6FwrnwwmaEqYcckffC7wYmbaS6cBiX","chain":"tron"}'
{
  "success": true,
  "address": "TAUN6FwrnwwmaEqYcckffC7wYmbaS6cBiX",
  "chain": "tron",
  "address_type": "wallet",
  "risk_level": "LOW",
  "risk_score": 8,
  "detection_count": 0,
  "detections": [],
  "metadata": { "is_sanctioned": false, "total_transactions": 1204 },
  "ml_anomaly_score": 0.1147,
  "scan_duration_ms": 6321,
  "cached": false
}

ステップ2: 重いアドレスは非同期スキャンでポーリングする

UTXO の多い Bitcoin アドレスや取引頻度の高い EVM アドレスは、同期スキャンだと HTTP のタイムアウトに掛かることがあります。202 とジョブIDを受け取り、status が completed になるまで status_url をポーリングしてから results_url を読みます。消費クォータは同期スキャンと同じ 1 件です。

curl -X POST https://chain-analyzer.com/api/v1/public/scan/async \
  -H "X-API-Key: tfk_your_key_here" -H "Content-Type: application/json" \
  -d '{"address":"347QFbejDBdMZFTxpmn6evvvqyXiqZTCd7","chain":"bitcoin"}'
{
  "success": true,
  "job_id": "550e8400-e29b-41d4-a716-446655440000",
  "status": "queued",
  "address": "347QFbejDBdMZFTxpmn6evvvqyXiqZTCd7",
  "chain": "bitcoin",
  "status_url": "/api/v1/public/scan/550e8400-e29b-41d4-a716-446655440000",
  "results_url": "/api/v1/public/scan/550e8400-e29b-41d4-a716-446655440000/results",
  "message": "Scan queued. Poll status_url until status is 'completed'."
}

ポーリング → 結果取得

curl -H "X-API-Key: tfk_your_key_here" \
  https://chain-analyzer.com/api/v1/public/scan/550e8400-e29b-41d4-a716-446655440000
curl -H "X-API-Key: tfk_your_key_here" \
  https://chain-analyzer.com/api/v1/public/scan/550e8400-e29b-41d4-a716-446655440000/results

ステップ3: 継続監視に載せて Webhook を受け取る

判定済みのアドレスを Watchlist に載せると定期再スキャンの対象になり、リスクレベルが変化した瞬間に Webhook が飛びます。登録直後の初回スキャンは非同期なので、レスポンスの initial_scan.status は pending で返ります(完了後に行が更新されます)。

curl -X POST https://chain-analyzer.com/api/v1/watchlist \
  -H "X-API-Key: tfk_your_key_here" -H "Content-Type: application/json" \
  -d '{"address":"TAUN6FwrnwwmaEqYcckffC7wYmbaS6cBiX","chain":"tron","label":"deposit-12345"}'
{
  "success": true,
  "item": {
    "id": "8f14e45f-ceea-467a-9a1c-1f0d3b6a2f77",
    "token_address": "TAUN6FwrnwwmaEqYcckffC7wYmbaS6cBiX",
    "chain": "tron",
    "label": "deposit-12345",
    "monitor_type": "address",
    "follow_mode_enabled": false,
    "follow_depth": 1,
    "last_risk_level": null,
    "last_scanned_at": null
  },
  "initial_scan": {
    "status": "pending",
    "risk_level": "UNKNOWN",
    "risk_score": 0,
    "detections": []
  }
}

Webhook エンドポイントを登録する

curl -X POST https://chain-analyzer.com/api/v1/webhooks/configs \
  -H "X-API-Key: tfk_your_key_here" -H "Content-Type: application/json" \
  -d '{"webhook_url":"https://ops.example.com/hooks/chainanalyzer",
       "description":"AML alerts",
       "events":["risk.changed","risk.critical_detected"]}'
{
  "config": {
    "id": "3d1f0c6e-5a2b-4f19-8f7a-0c9d2e6b41aa",
    "webhook_url": "https://ops.example.com/hooks/chainanalyzer",
    "description": "AML alerts",
    "events": ["risk.changed", "risk.critical_detected"],
    "is_active": true,
    "created_at": "2026-08-14T02:11:44Z"
  },
  "secret": "b7c19a2f…8e04d1",
  "message": "Save this secret securely. It won't be shown again."
}

secret は作成時に1度だけ返ります。配信には X-ChainAnalyzer-Signature: sha256=<HMAC-SHA256(secret, リクエストボディ全文)> が付くので、受信側はボディのバイト列で検証してください。

risk.critical_detected の実際の配信ペイロード:

{
  "event": "risk.critical_detected",
  "timestamp": "2026-08-14T03:27:19.482913",
  "data": {
    "address": "TAUN6FwrnwwmaEqYcckffC7wYmbaS6cBiX",
    "chain": "tron",
    "previous_risk_level": "LOW",
    "risk_level": "CRITICAL",
    "risk_score": 100,
    "detections": [
      {
        "detector_id": "B2",
        "detector_name": "OFAC_SANCTIONED",
        "severity": "CRITICAL",
        "description": "Address is on OFAC SDN sanctions list"
      }
    ],
    "detail_url": "https://chain-analyzer.com/scan?address=TAUN6Fwrnwwm…&chain=tron",
    "score_semantics": "risk_0to100"
  }
}

risk.critical_detected / risk.high_detected は、監視対象が新たにそのレベルを跨いだ瞬間に risk.changed とは別イベントとして発火します(二重通知を避けるため Watchlist 対象に限定)。data の中身は3イベントとも同じ形です。webhook_url が hooks.slack.com のときだけ、この形ではなく Slack の blocks 形式に変換して送信されます。

ステップ4: 残クォータを確認する

プラン上限をクライアント側にハードコードせず、このエンドポイントを参照してください。読み取り専用でクォータを消費しません。-1 は無制限を意味します。

curl -H "X-API-Key: tfk_your_key_here" \
  https://chain-analyzer.com/api/v1/public/usage
{
  "plan_id": "enterprise",
  "scans_per_month": -1,
  "scans_used": 8412,
  "scans_remaining": -1,
  "topup_remaining": 0,
  "period": "2026-08",
  "period_reset_at": "2026-09-01T00:00:00Z",
  "api_rate_limit_per_min": 300,
  "presign_rate_limit_per_min": 1200,
  "batch_limit": 500,
  "watchlist_limit": -1,
  "webhook_limit": -1
}

クライアント実装例(Python)

「高速レーンでスクリーニング → 必要ならフルスキャン → 判定」を requests で実装した最小例です。

import requests

BASE = "https://chain-analyzer.com/api/v1"
HEADERS = {"X-API-Key": "tfk_your_key_here"}


def screen(address: str, chain: str) -> dict:
    """Fast lane first; escalate to a full scan only when it is not clean."""
    r = requests.get(
        f"{BASE}/public/presign/check",
        params={"chain": chain, "to": address},
        headers=HEADERS,
        timeout=10,
    )
    r.raise_for_status()
    verdict = r.json()

    # "ok" means registry + scam-database lookups found nothing. Accept and stop:
    # this call costs no monthly quota, so it is safe on every transaction.
    if verdict["verdict"] == "ok":
        return {"decision": "accept", "risk_score": verdict["score"]}

    # Not clean -> spend 1 scan on the full detector pipeline for the audit trail.
    r = requests.post(
        f"{BASE}/public/scan",
        json={"address": address, "chain": chain},
        headers=HEADERS,
        timeout=120,
    )
    r.raise_for_status()
    scan = r.json()

    # risk_score is 0-100, higher = riskier. CRITICAL always blocks.
    decision = "block" if scan["risk_level"] in ("CRITICAL", "HIGH") else "review"
    return {
        "decision": decision,
        "risk_score": scan["risk_score"],
        "detections": [d["detector_name"] for d in scan["detections"]],
    }


print(screen("TAUN6FwrnwwmaEqYcckffC7wYmbaS6cBiX", "tron"))

事前スクリーニング(入出金・署名前チェック)

入金の受け入れ判定・出金前の宛先チェック・ウォレット署名前の警告表示に使う、低レイテンシのリスク判定エンドポイントです。VASP のホットパス向けに設計されています。

  • 低レイテンシ: レジストリと ScamDB の照合が中心で、外部 RPC 呼び出しは最大1回(approve の spender 判定のみ)。
  • 月間スキャンクォータを消費しない: 1トランザクションごとに呼ぶ前提のため、課金対象外です。
  • 専用のレート枠: 通常 API とは別バケットで、プランの毎分上限の4倍(Pro 240 / Business 480 / Enterprise 1200)。スクリーニングの連打がスキャンやバッチ処理を押し出しません。
  • calldata / spender を伴わない判定は約120秒キャッシュ。calldata・spender 付きは毎回その場で評価します。
メソッドパス認証説明
GET/public/presign/checktfk_宛先 / spender の署名前リスク判定(APIキー版)

主なパラメータ: chain(必須)・to(必須・宛先または spender)・value・data / calldata・spender・kind・signer・asset。

curl -H "X-API-Key: tfk_your_key_here" \
  "https://chain-analyzer.com/api/v1/public/presign/check?chain=ethereum&to=0x1234..."

レスポンス

{
  "level": "critical",
  "verdict": "danger",
  "score": 100,
  "reasons": ["Address is on the OFAC SDN sanctions list"],
  "signals": { "sanctioned": true },
  "confidence": 1.0,
  "chain": "ethereum",
  "to": "0x1234...",
  "latency_ms": 12,
  "cached": false
}

Scan API

メソッドパス認証説明
POST/public/scantfk_アドレスをスキャン(全12チェーン対応: Bitcoin / Ethereum / Polygon / BNB / Base / Arbitrum / Optimism / Avalanche / Solana / Kaia / TRON / XRP)。結果は30分キャッシュされます。
GET/public/scantfk_同じスキャンのクエリパラメータ版(GET)
POST/public/scan/asynctfk_1アドレスを非同期スキャン(202 + ジョブID)
POST/public/scan/batchtfk_バッチスキャンジョブを投入(Pro: 100件/回・Business: 200件/回・Enterprise: 500件/回)
GET/public/scan/{job_id}tfk_ジョブの進捗を確認(バッチ / 非同期スキャン共通)
GET/public/scan/{job_id}/resultstfk_ジョブの結果を取得(score_semantics 付き)
GET/public/scanstfk_直近の記録済みスキャンを一覧(新しい順・最大100件/ページ)
GET/public/scans/{scan_id}tfk_記録済みスキャン1件を detections 付きで取得
GET/public/usagetfk_当月の使用量とプラン上限を取得
GET/public/health不要APIヘルスチェック(認証不要)
POST /public/scan

リクエスト

{
  "address": "347QFbejDBdMZFTxpmn6evvvqyXiqZTCd7",
  "chain": "bitcoin"
}

レスポンス

{
  "success": true,
  "address": "347QFbejDBdMZFTxpmn6evvvqyXiqZTCd7",
  "chain": "bitcoin",
  "address_type": "wallet",
  "risk_level": "CRITICAL",
  "risk_score": 100,
  "detection_count": 4,
  "detections": [
    {
      "detector_id": "B2",
      "detector_name": "OFAC_SANCTIONED",
      "severity": "CRITICAL",
      "description": "Address is on OFAC SDN sanctions list",
      "details": { "category": "OFAC_SANCTIONED" }
    }
  ],
  "metadata": {
    "btc_balance": 0.0,
    "total_transactions": 69,
    "is_sanctioned": true
  },
  "ml_anomaly_score": 0.3431,
  "scan_duration_ms": 19045,
  "cached": false
}

risk_score は 0(安全)〜 100(危険)。risk_level は CRITICAL / HIGH / MEDIUM / LOW / UNKNOWN。

非同期スキャン(202 + ポーリング)

大口 UTXO の Bitcoin アドレスや取引頻度の高い EVM アドレスは、同期スキャンだと HTTP のタイムアウトに掛かることがあります。その場合はこちらへ。202 とジョブIDが即返り、ジョブは永続化されるので処理系の再起動でも消えません。

POST /public/scan/async

レスポンス (202)

{
  "success": true,
  "job_id": "550e8400-e29b-41d4-a716-446655440000",
  "status": "queued",
  "address": "0x1234...",
  "chain": "ethereum",
  "status_url": "/api/v1/public/scan/550e8400-e29b-41d4-a716-446655440000",
  "results_url": "/api/v1/public/scan/550e8400-e29b-41d4-a716-446655440000/results",
  "message": "Scan queued. Poll status_url until status is 'completed'."
}

status_url を status が completed になるまでポーリングし、results_url で結果を取得します。

curl -H "X-API-Key: tfk_your_key_here" \
  https://chain-analyzer.com/api/v1/public/scan/550e8400-.../results
{
  "job_id": "550e8400-e29b-41d4-a716-446655440000",
  "score_semantics": "risk_0to100",
  "results": [
    {
      "address": "0x1234...",
      "chain": "ethereum",
      "status": "completed",
      "risk_level": "HIGH",
      "risk_score": 78,
      "detection_count": 3,
      "detections": [],
      "metadata": {},
      "error_message": null,
      "completed_at": "2026-08-13T04:21:07Z"
    }
  ]
}

消費クォータは同期スキャンと同じ 1 件(成功時に1度だけ計上)。バッチ機能が付かないプランでも利用できます。

POST /public/scan/batch

バッチスキャンジョブを投入(Pro: 100件/回・Business: 200件/回・Enterprise: 500件/回)

リクエスト

{
  "addresses": [
    "DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263",
    "0x1234567890123456789012345678901234567890"
  ],
  "include_ai_analysis": true,
  "notify_email": "user@example.com"
}

レスポンス

{
  "success": true,
  "job_id": "550e8400-e29b-41d4-a716-446655440000",
  "total_addresses": 2,
  "message": "Batch scan queued for 2 addresses."
}

スキャン履歴

記録済みスキャンをテナント単位で読み出します。読み取り専用のため月間クォータは消費しません。

curl -H "X-API-Key: tfk_your_key_here" \
  "https://chain-analyzer.com/api/v1/public/scans?limit=20&offset=0"
対象範囲: 単発スキャン(Web コンソール・同期 POST /public/scan・非同期 POST /public/scan/async)がここに記録されます。大量バッチの結果はこの履歴ではなく GET /public/scan/{job_id}/results で取得してください。保持期間はプランの history_days に従います(Free 7日 / Starter 30日 / Pro 180日 / Business 365日 / Enterprise 無期限)。

使用量とクォータ

プラン上限をクライアント側にハードコードせず、このエンドポイントを参照してください。読み取り専用のため月間クォータは消費しません。-1 は無制限を意味します。

GET /public/usage
{
  "plan_id": "business",
  "scans_per_month": 3000,
  "scans_used": 412,
  "scans_remaining": 2588,
  "topup_remaining": 0,
  "period": "2026-08",
  "period_reset_at": "2026-09-01T00:00:00Z",
  "api_rate_limit_per_min": 120,
  "presign_rate_limit_per_min": 480,
  "batch_limit": 200,
  "watchlist_limit": 100,
  "webhook_limit": 5
}

監視(Watchlist / Webhook)

アドレスを継続監視し、リスク変化を Webhook で受け取れます。Watchlist の登録数と Webhook のエンドポイント数はプラン上限がサーバー側で強制されます。

メソッドパス認証説明
GET/watchlisttfk_ウォッチリストを取得
POST/watchlisttfk_アドレスを監視対象に追加
DELETE/watchlist/{item_id}tfk_監視対象から削除
POST/watchlist/{item_id}/rescantfk_即時再スキャン(変化検知・通知込み)
PATCH/watchlist/{item_id}/followtfk_Follow Mode の有効化 / 深度変更(Pro以上・深度はプラン上限に丸め)
GET/watchlist/{item_id}/discoveriestfk_Follow Mode が発見した関連アドレス一覧
GET/webhooks/configstfk_Webhook 設定一覧
POST/webhooks/configstfk_Webhook エンドポイントを登録(署名シークレットは作成時に1度だけ返却)
PATCH/webhooks/configs/{config_id}tfk_Webhook 設定の部分更新(URL・購読イベント・有効/無効)
DELETE/webhooks/configs/{config_id}tfk_Webhook 設定を削除
POST/webhooks/testtfk_テスト配信を送信
GET/webhooks/deliveriestfk_配信ログを取得(失敗調査用)
GET/webhooks/events不要購読可能なイベント一覧(認証不要)

Webhook イベント

イベント説明
risk.changed監視中アドレスのリスクレベルが変化したとき
risk.high_detectedHIGH リスクを検知したとき
risk.critical_detectedCRITICAL リスクを検知したとき
scan.completedスキャンが完了したとき
batch.completedバッチジョブが完了したとき
watchlist.alertウォッチリストの一般アラート

調査(ケース / STR / エクスポージャー)

調査ケースの作成・アドレス集約・一括スキャン・統合PDF・エクスポージャー分析・資金フロー探索まで、UI と同じ機能を API から呼べます。重い処理(一括スキャン・STRパッケージ生成)は 202 + ステータスポーリングです。

メソッドパス認証説明
CRUD/casestfk_ケースの作成・取得・更新・削除、アドレスとノートの追加/更新/削除
POST/cases/{case_id}/bulk-scantfk_ケース内アドレスの一括スキャンを起動(202)/進捗をポーリング
GET/cases/{case_id}/report.pdftfk_ケース全アドレスの統合PDFレポート
POST / GET/cases/{case_id}/str-packagetfk_STR(疑わしい取引の届出)支援パッケージの生成・取得(証跡PDF / ドラフト.docx / 43列CSV) Enterprise
GET/exposure/{address}tfk_多段エクスポージャー分析(直接・間接をリスク階層別に集計)
GET/exposure/{address}/terminalstfk_起点アドレスから到達する分類済み終端を経路付きで列挙 Business+
POST/graph/flow-pathtfk_2アドレス間の有向資金フロー経路 Pro+
POST/graph/relationship-checktfk_2アドレスの関連性と共通取引相手 Enterprise
POST/scan/txtfk_トランザクションハッシュから送信元・宛先を両方スキャン(全12チェーン対応) Enterprise
GET/risk-report/{address}tfk_単一アドレスのリスク評価レポート(PDF・エクスポージャーとAI要約込み)

POST /scan/tx は 8 EVM チェーンに加えて Bitcoin・Solana・TRON・XRP でも解決できます(全12チェーン)。tx_hash の形式はチェーン依存で、EVM は 0x + 64桁hex、Bitcoin / TRON / XRP は 0x なしの64桁hex、Solana は 87〜88文字の base58 です。TRON の TRC-20 転送はコントラクトではなく Transfer イベントの当事者に解決され、XRPL の Payment は要求額ではなく実際の delivered amount を報告します(Payment 以外の型は関与アカウントと note を返します)。Enterprise プラン(連携試用枠を含む)限定です。

機能の詳細: ワンショット調査コントラクト監視バッチスキャン

取引照会(期間指定)

アドレススキャンでは答えられない「この顧客がこのトークンで先四半期に何をしたか」という照会系の2エンドポイントです。どちらも UTC の期間を明示して呼びます。

メソッドパス認証説明
POST/tx-querytfk_1アドレス × 1トークンの送受信を期間指定で取得(相手方の集計付き)
POST/contract-alerttfk_トークンコントラクト全体を掃引し、悪性パターンに一致したアドレスを列挙
対応チェーンは2つのモードで意図的に異なります。/tx-query は 8 EVM チェーン + Solana + TRON(TronGrid の TRC-20 アカウントフィードが期間で絞れるため)。/contract-alert は 8 EVM チェーン + Solana で、TRON は非対応です。XRP と Bitcoin はどちらのモードも非対応です(XRPL の発行通貨は (通貨, 発行者) の組でコントラクトではなく、Bitcoin にはトークン層がないため、token_contract に相当するものがありません)。これらのチェーンはアドレススキャン系(/public/scan・/scan/tx・Follow Mode)を使ってください。

start_date / end_date は必須です。end_date は start_date より後である必要があり、期間は最大90日です。90日を超えるリクエストは切り詰めではなく 400 を返します。返却および分析の対象は直近500件が上限なので、それを超える期間は分割して呼んでください。

どちらも読み取り専用で、月間スキャンクォータを消費しません(プランの毎分リクエスト上限は消費します)。

POST /tx-query

指定アドレスが指定トークンで行った送受信を期間内で全件返し、あわせて相手方ごとの集計(件数・金額・ネット)を known_registry のラベル付きで返します。

リクエスト

{
  "address": "TAUN6FwrnwwmaEqYcckffC7wYmbaS6cBiX",
  "token_contract": "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t",
  "chain": "tron",
  "start_date": "2026-05-01T00:00:00Z",
  "end_date": "2026-07-30T00:00:00Z",
  "lang": "en"
}

レスポンス

{
  "success": true,
  "chain": "tron",
  "address": "TAUN6FwrnwwmaEqYcckffC7wYmbaS6cBiX",
  "token_contract": "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t",
  "token_symbol": "USDT",
  "start_date": "2026-05-01T00:00:00Z",
  "end_date": "2026-07-30T00:00:00Z",
  "total_transfers": 128,
  "transfers": [
    {
      "tx_hash": "5f2c…",
      "block_number": 74210553,
      "timestamp": "2026-07-29T11:04:12Z",
      "from_address": "TAUN6FwrnwwmaEqYcckffC7wYmbaS6cBiX",
      "to_address": "TXLAQ63Xg1NAzckPwKHvzw7CSEmLMEqcdj",
      "amount": 24500.0,
      "token_symbol": "USDT",
      "token_decimals": 6,
      "direction": "sent",
      "counterparty": "TXLAQ63Xg1NAzckPwKHvzw7CSEmLMEqcdj"
    }
  ],
  "counterparties": [
    {
      "address": "TXLAQ63Xg1NAzckPwKHvzw7CSEmLMEqcdj",
      "label": "Unknown",
      "category": "unknown",
      "sent_count": 12,
      "received_count": 3,
      "sent_amount": 291400.0,
      "received_amount": 18000.0,
      "net_amount": -273400.0
    }
  ],
  "query_duration_ms": 4187,
  "error": null
}

クエリ失敗は 400 + detail で返るため、200 のレスポンスは常に success: true・error: null です。

POST /contract-alert

/tx-query の裏返しで、アドレスを指定せずトークンの全転送を掃引し、悪性パターンに一致したアドレスだけを列挙します。発行体が自トークンを定点観測する用途を想定しています。

リクエスト

{
  "token_contract": "0xdAC17F958D2ee523a2206206994597C13D831ec7",
  "chain": "ethereum",
  "start_date": "2026-07-01T00:00:00Z",
  "end_date": "2026-07-31T00:00:00Z",
  "lang": "en"
}

レスポンス

{
  "success": true,
  "chain": "ethereum",
  "token_contract": "0xdAC17F958D2ee523a2206206994597C13D831ec7",
  "token_symbol": "USDT",
  "start_date": "2026-07-01T00:00:00Z",
  "end_date": "2026-07-31T00:00:00Z",
  "total_transfers_analyzed": 500,
  "flagged_addresses": [
    {
      "address": "0x1234567890123456789012345678901234567890",
      "pattern_type": "address_poisoning",
      "severity": "HIGH",
      "reason": "Zero-value transfers from an address matching the first and last 4 characters of a real counterparty",
      "tx_count": 7,
      "total_amount": 0.0,
      "sample_tx_hash": "0xabc…"
    }
  ],
  "query_duration_ms": 9042,
  "error": null
}

検知パターン(pattern_type)

pattern_type説明
known_maliciousレジストリ登録済みの既知悪性アドレス
address_poisoningアドレスポイズニング(酷似アドレスによる誤送金誘導)
relay_chain中継チェーン(受領直後にほぼ全額を次へ転送)
rapid_distribution短時間での多数分散
large_transfer異常な大口転送

ScamDB API

認証不要の公開OSINT API。IPベースレート制限あり。

メソッドパス認証説明
GET/scamdb/lookup/{address}不要アドレスがScamDBに登録されているか照合(無料・認証不要)
GET/scamdb/entries不要検証済みScamDBエントリー一覧(ページネーション対応)
GET/scamdb/entries/{scam_id}不要個別ScamDBエントリーを取得
GET/scamdb/stats不要ScamDB統計情報
GET/scamdb/search?q=...tfk_ScamDB全文検索(tfk_キー必要)
POST/scamdb/reporttfk_スキャム報告を送信(tfk_キー必要)
GET /scamdb/lookup/{address}
curl https://chain-analyzer.com/api/v1/scamdb/lookup/7kMpieh2THdaC5eUvxFJDL3TdsQWVQCwdhsEjLj1eL26

レスポンス

{
  "found": true,
  "entry": {
    "id": "SCAM-001",
    "address": "7kMpieh2THdaC5eUvxFJDL3TdsQWVQCwdhsEjLj1eL26",
    "type": "drainer",
    "severity": "danger",
    "domains": ["solland.cc", "hibit.app"],
    "method": "FCFS airdrop phishing",
    "total_stolen_usd": 3700,
    "verified": true
  },
  "match_type": "exact"
}

レート制限

プランリクエスト/分説明
Pro60REST API
Business120REST API
Enterprise300REST API
Pro / Business / Enterprise240 / 480 / 1200事前スクリーニング(専用枠)
Any (IP-based)30ScamDB reads
主要エンドポイントの成功レスポンスには X-RateLimit-Limit / X-RateLimit-Remaining が付きます。429 のときは Retry-After(秒)に従って再試行してください。

ScamDB読み取り: IPベース30 req/min。レート制限超過時は429エラーが返されます。

月間スキャンクォータ

プランスキャン/月
Free10
Starter200
Pro1,000
Business3,000
EnterpriseUnlimited

消費するのは実行系のみです。同期スキャン・非同期スキャンは 1 件、バッチとケース一括スキャンは 1 アドレス = 1 件(成功した分だけ計上)。事前スクリーニング・使用量参照・履歴・レポート取得などの読み取り系は 0 件です。

エラーコード

コード説明
400不正なリクエスト(パラメータエラー)
401認証エラー(APIキーが無効または未設定)
403アクセス拒否(プランの機能制限)
404リソースが見つからない
409競合(同じケースのジョブが実行中など)
410対象が再構築できない(再生成が必要)
422バリデーションエラー(必須フィールド欠落・型不一致)
429レート制限超過、または月間クォータ超過
500サーバーエラー

エラーハンドリング

エラーは FastAPI 標準の {"detail": "..."} 形式です。ステータスごとにクライアント側の取るべき対応が変わります。

401 — 認証

X-API-Key(または Authorization: Bearer)が無い場合は detail: "API key required"、キーが失効・無効な場合は detail: "Invalid API key"。再試行しても回復しません。キーの取り違えとリボークを疑ってください。キーやプランの変更は最大5分で伝播します。

{ "detail": "Invalid API key" }

403 — プラン制限

キーは有効だが、その機能が現在のプランに含まれていません。文言は機能ごとに固定です(例: "Transaction-hash scan is an Enterprise feature." / "Batch scanning not available on your plan" / "Watchlist limit reached (100 items)")。再試行は無意味で、アップグレードまたは登録数の削減が必要です。

{ "detail": "Transaction-hash scan is an Enterprise feature." }

404 — 不在

存在しないリソース、または他テナント所有のリソースです。両者は区別されません(存在の漏洩を避けるため)。ジョブIDやケースIDの取り違え、保持期間切れを疑ってください。

422 — バリデーション

リクエストボディやパスパラメータの型が合っていません(必須フィールド欠落、UUID でない scan_id など)。FastAPI が生成する構造化エラーで、detail は場所と理由を含む配列になります。400 と違い、サーバーに届く前段で弾かれています。

{
  "detail": [
    {
      "type": "missing",
      "loc": ["body", "token_contract"],
      "msg": "Field required"
    }
  ]
}

429 — レート制限とクォータ

429 には性質の異なる2種類があり、ヘッダーの有無で機械的に判別できます。

(a) 毎分レート制限 — Retry-After あり

detail は "Rate limit exceeded. Max 120 requests per minute."。Retry-After(秒)・X-RateLimit-Limit・X-RateLimit-Remaining: 0 が付きます。Retry-After に従って待てば必ず回復するので、バックオフして再試行してください。

HTTP/1.1 429 Too Many Requests
Retry-After: 37
X-RateLimit-Limit: 120
X-RateLimit-Remaining: 0

{ "detail": "Rate limit exceeded. Max 120 requests per minute." }

(b) 月間スキャンクォータ超過 — Retry-After なし

detail は残数を含む日本語固定文言です(Accept-Language や lang によらず日本語で返ります)。Retry-After は付きません。翌 UTC 月まで再試行しても回復しないため、バックオフではなくプランのアップグレードやスキャンパックの購入で解決します。明示リストを送るバッチ系では、残数不足を黙って切り詰めず「残り N 件に対して M 件の要求」という別文言で返します。

HTTP/1.1 429 Too Many Requests

{
  "detail": "月間スキャン上限に達しています(1000 / 1000 件)。プランのアップグレード、またはスキャンパックの購入をご検討ください。"
}
判別方法: 429 に Retry-After があればレート制限(待てば回復)、無ければクォータ超過(待っても回復しない)。GET /public/usage の scans_remaining で事前に検知するのが確実です。

スコアの向き

エラー処理と同じくらい取り違えが多いのがスコアの向きです。risk_score・score はいずれも 0(安全)〜 100(危険)で、大きいほど危険側です。履歴・バッチ・Webhook のペイロードには score_semantics: "risk_0to100" が付くので、クライアント側で規約をアサートしてください。

SDK(予定)

Python、JavaScript、Go用のSDKを準備中です。

Python JavaScript Go

このページをシェア

X Facebook LinkedIn

© 2026 ChainAnalyzer. All rights reserved.