# Scanna Insider Risk Score

> Scanna Insider Risk Score is a paid API for AI agents from api.scanna.xyz, paid per call via x402, $0.020013/call, status unknown (last checked 2026-09-14).

Returns a 0-100 insider-risk score for a single Polymarket proxy wallet address based on its pre-computed stats row

## Facts

- Endpoint: GET https://api.scanna.xyz/insider-score
- Price: $0.020013/call
- Payment: x402
- Status: unknown
- Last checked: 2026-09-14
- Activations on Zero: 0
- Tags: x402
- Canonical page: https://www.zero.xyz/c/scanna-insider-risk-score-432e5c2d
- Structured record (JSON): https://api.zero.xyz/v1/capabilities/cap_ic5BRgZ4qB_8fH_YiartW

Status and success rate cover calls made through Zero and Zero's own probes. Third-party monitors may report differently.

## How to call it through Zero

Zero handles the 402 payment challenge and records the run. With the Zero CLI installed (`npm i -g @zeroxyz/cli`):

```sh
zero fetch --capability scanna-insider-risk-score-432e5c2d
```

Example prompt: What's the insider risk score for Polymarket wallet 0x3f5CE5FBFe3E9af3971dD833D26bA9b5C936f0bE? I want to know the risk level, score, and any risk factors that fired.

## When to prefer this

Use this endpoint when you need a fast, single-wallet insider-risk signal derived entirely from pre-computed on-chain stats — no scanning required. Prefer it over building your own heuristics when you want a normalized 0-100 score with labeled risk factors and a risk level classification. Best for real-time wallet screening, compliance checks, or copy-trading vetting where latency matters and you only need one wallet at a time.

## Known failure modes

- 400 Bad Request: wallet query parameter is absent or malformed
- 404 Not Found: wallet has no stats row in the database, or the stats-read itself failed (these two cases are indistinguishable)
- Score is lower than expected because wallet_age_days is null when first_seen was never materialized — this is not an error but a meaningful data gap
- Thin-wallet scores (few trades, low volume) are valid 200 responses but carry lower signal reliability

## How this service works

A 0-100 insider-risk score for ONE wallet, from that wallet's stats row alone: a single primary-key read, never a scan. Wallet age uses materialized first_seen; when absent, wallet_age_days is null and contributes NOTHING, so the score is LOWER than for a wallet whose age is known. Missing wallet is 400. A wallet with no row is 404 - and so is a stats-read FAILURE, which this route cannot distinguish. A thin-wallet score is a billable 200.

## Output

A JSON object containing the lowercased wallet address, an integer risk_score from 0-100 (higher = more insider-like), a risk_level enum (low/medium/high), an array of human-readable risk_factors sentences explaining which signals fired, total_trades count, total_volume in whole USD, avg_position_size in whole USD, and wallet_age_days (integer or null — null means the age factor contributed nothing and the score is lower than it would be if age were known).

## Request schema (JSON Schema)

```json
{
 "type": "object",
 "$schema": "https://json-schema.org/draft/2020-12/schema",
 "required": [
  "input"
 ],
 "properties": {
  "input": {
   "type": "object",
   "required": [
    "type",
    "method"
   ],
   "properties": {
    "type": {
     "type": "string",
     "const": "http"
    },
    "method": {
     "enum": [
      "GET"
     ],
     "type": "string"
    },
    "queryParams": {
     "type": "object",
     "required": [
      "wallet"
     ],
     "properties": {
      "wallet": {
       "type": "string",
       "description": "Proxy wallet address, case-insensitive. Absent is 400; no stats row is 404."
      }
     },
     "additionalProperties": false
    }
   },
   "additionalProperties": false
  },
  "output": {
   "type": "object",
   "required": [
    "type"
   ],
   "properties": {
    "type": {
     "type": "string"
    },
    "example": {
     "type": "object",
     "required": [
      "address",
      "avg_position_size",
      "risk_factors",
      "risk_level",
      "risk_score",
      "total_trades",
      "total_volume",
      "win_rate"
     ],
     "properties": {
      "address": {
       "type": "string",
       "description": "Lowercased wallet address"
      },
      "win_rate": {
       "type": "number",
       "description": "3dp"
      },
      "risk_level": {
       "enum": [
        "low",
        "medium",
        "high"
       ],
       "type": "string"
      },
      "risk_score": {
       "type": "integer",
       "description": "0-100; HIGHER means more insider-like"
      },
      "risk_factors": {
       "type": "array",
       "items": {
        "type": "string"
       },
       "description": "Sentences for the contributions that fired; empty when none did"
      },
      "total_trades": {
       "type": "integer"
      },
      "total_volume": {
       "type": "integer",
       "description": "Rounded whole USD"
      },
      "wallet_age_days": {
       "type": [
        "integer",
        "null"
       ],
       "description": "NULL when first_seen was never materialized. Null means the age factor contributed NOTHING, so the score is LOWER than it would otherwise be, not neutral."
      },
      "avg_position_size": {
       "type": "integer",
       "description": "Rounded whole USD"
      }
     }
    }
   }
  }
 }
}
```

## More

- Live health (JSON, refreshed every minute): https://www.zero.xyz/c/scanna-insider-risk-score-432e5c2d/health.json
- [Zero catalog index](https://www.zero.xyz/llms.txt)
- [Other services from api.scanna.xyz](https://www.zero.xyz/host/api.scanna.xyz/llms.txt)
