# Otto AI Token Score

> Otto AI Token Score is a paid API for AI agents from x402.ottoai.services, paid per call via x402, $0.01/call, status unknown (last checked 2026-09-14).

Returns a composite 0-100 market structure score for a Base ERC-20 token, derived from seven weighted factors including liquidity, holder concentration, volume, age, pool breadth, and price stability.

## Facts

- Endpoint: GET https://x402.ottoai.services/token-score
- Price: $0.01/call
- Payment: x402
- Status: unknown
- Last checked: 2026-09-14
- Activations on Zero: 0
- Tags: x402
- Canonical page: https://www.zero.xyz/c/otto-ai-token-score-46327503
- Structured record (JSON): https://api.zero.xyz/v1/capabilities/cap_bKkENFNMyA4OnHU3su8S2

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 otto-ai-token-score-46327503
```

Example prompt: Give me a full market structure score for the Base token at contract address 0x532f27101965dd16442e59d40670fac45d143f5e — I want to see the composite 0-100 score, each of the seven factor sub-scores, and the raw liquidity and holder data behind them.

## When to prefer this

Use this endpoint when you need a structured, auditable, multi-factor market quality score for a specific Base ERC-20 token identified by contract address. Prefer it over generic token price endpoints when you need more than price — specifically liquidity depth, holder distribution, pool breadth, and price stability combined into a single comparable number. It is especially valuable when comparing tokens, screening for rug-pull risk, or justifying a position programmatically, because the full breakpoint curves and sub-scores make the composite reproducible and explainable. Use the contract address form (not ticker) to avoid cross-chain resolution ambiguity.

## Known failure modes

- Invalid or non-Base contract address returns an error — only Base (chain 8453) ERC-20 addresses accepted
- Token not found in any data plane — score may be withheld (scoreWithheldReason non-null) if weight coverage falls below 0.5 minimum
- Partial data plane outage returns degraded:true in meta; affected factors marked present:false with absenceReason
- Stale or unavailable pool data causes liquidity/volume factors to be absent, reducing coverage
- Ticker symbol passed instead of contract address will fail — use /token-price sibling for symbol resolution first

## How this service works

Token score by contract address — one 0-100 composite of a Base token market structure from seven weighted factors: USD liquidity, holder concentration, holder count, 24h volume, market age, pool breadth and price stability. Every sub-score, weight, raw input, source plane and read time comes back with the number, plus the full breakpoint curve, so the score can be recomputed from the response. A factor whose data plane is unavailable is reporte…

## Output

Returns a JSON object with: a composite 0-100 score and band label (e.g. 'high'), an array of seven factor objects each containing key, raw input value, sub-score, weight, data plane name, and read timestamp, a formula object with the full breakpoint curves so the score can be independently recomputed, coverage metadata (how many factors were present, total weight coverage), token context fields (FDV, market cap, price, 24h volume, holder count, pool count, top-10 supply percent), caveats, a methodology URL, and a generatedAt timestamp.

## 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": [
      "token"
     ],
     "properties": {
      "token": {
       "type": "string",
       "description": "Base (chain 8453) ERC-20 contract address, 0x followed by 40 hex characters. Address-keyed on purpose: a ticker symbol could resolve to a different chain deployment on one data plane than on another, and the composite would then fuse two tokens. Use /token-price for symbol lookups."
      }
     }
    }
   },
   "additionalProperties": false
  },
  "output": {
   "type": "object",
   "required": [
    "type"
   ],
   "properties": {
    "type": {
     "type": "string"
    },
    "example": {
     "type": "object",
     "required": [
      "status"
     ],
     "properties": {
      "data": {},
      "meta": {
       "type": "object"
      },
      "reason": {
       "type": "string",
       "description": "status=unavailable only; every >=400 is UNCHARGED"
      },
      "status": {
       "enum": [
        "success",
        "unavailable"
       ],
       "type": "string"
      }
     }
    }
   }
  }
 }
}
```

## Response schema (JSON Schema)

```json
{
 "type": "json",
 "example": {
  "data": {
   "band": "high",
   "note": "A single 0-100 read on this toke...",
   "score": 74.6,
   "token": {
    "name": "Brett",
    "symbol": "BRETT",
    "address": "0x532f27101965dd16442e59d40670fa...",
    "network": "base"
   },
   "caveats": [
    {
     "code": "token_score_is_market_structure_...",
     "plain": "This score measures market struc...",
     "affects": [
      "score"
     ]
    }
   ],
   "context": {
    "fdvUsd": 418200000,
    "priceUsd": 0.04182,
    "turnover24h": 0.121,
    "liquidityUsd": 1115151.5,
    "marketCapUsd": 414220000,
    "totalHolders": 3420,
    "volume24hUsd": 284110.9,
    "poolsReturned": 20,
    "distinctDexCount": 10,
    "matchedPoolCount": 20,
    "oldestPoolAgeDays": 118,
    "priceChange24hPct": -6.8,
    "pooledLiquidityUsd": 2343405.11,
    "top10SupplyPercent": 33.4,
    "absPriceChange24hPct": 6.8,
    "holderChange7dPercent": 1.9
   },
   "factors": [
    {
     "key": "liquidity",
     "input": 2343405.11,
     "plane": "dex-pools-token",
     "score": 85.6,
     "weight": 0.24,
     "present": true,
     "measures": "USD liquidity summed across the ...",
     "inputUnit": "USD",
     "planeReadAt": "2026-09-01T11:58:06.000Z",
     "absenceReason": null
    }
   ],
   "formula": {
    "bands": [
     {
      "min": 80,
      "band": "very-high"
     }
    ],
    "method": "weighted-mean-of-piecewise-linea...",
    "factors": [
     {
      "key": "liquidity",
      "plane": "dex-pools-token",
      "weight": 0.24,
      "measures": "USD liquidity summed across the ...",
      "inputUnit": "USD",
      "inputField": "context.pooledLiquidityUsd",
      "breakpoints": [
       {
        "x": 0,
        "score": 0
       }
      ]
     }
    ],
    "description": "Each factor maps its raw input o...",
    "minWeightCoverage": 0.5
   },
   "coverage": {
    "factorsTotal": 7,
    "factorsPresent": 7,
    "planesAnswered": [
     "dex-price-base"
    ],
    "weightCoverage": 1,
    "minWeightCoverage": 0.5,
    "planesUnavailable": []
   },
   "generatedAt": "2026-09-01T12:00:00.000Z",
   "methodology": "https://docs.useotto.xyz/acp-swa...",
   "scoreWithheldReason": null
  },
  "meta": {
   "degraded": false,
   "validUntil": "",
   "generatedAt": "",
   "stalenessSec": 0
  },
  "status": "success"
 }
}
```

## More

- Live health (JSON, refreshed every minute): https://www.zero.xyz/c/otto-ai-token-score-46327503/health.json
- [Zero catalog index](https://www.zero.xyz/llms.txt)
- [Other services from x402.ottoai.services](https://www.zero.xyz/host/x402.ottoai.services/llms.txt)
