{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://artifacts.apis.io/fiatdock-com/json-schema/fiatdock-com-token-verdict-schema.json",
  "title": "TokenVerdict",
  "description": "Paid. Token verdict (EVM + Solana).",
  "x-generated": "2026-11-07",
  "x-method": "derived",
  "x-generator": "derive-json-schema.py",
  "x-source": "openapi/fiatdock-com-openapi.json#/components/schemas/TokenVerdict",
  "type": "object",
  "properties": {
    "network": {
      "type": "string",
      "description": "Chain the token was read on (base, ethereum, …, or solana)"
    },
    "token": {
      "type": "string",
      "description": "The token address read (an EVM address lower-cased; a Solana mint as given)"
    },
    "name": {
      "type": [
        "string",
        "null"
      ],
      "description": "Token name — the deployer's text, clamped"
    },
    "symbol": {
      "type": [
        "string",
        "null"
      ],
      "description": "Token symbol — the deployer's text, clamped"
    },
    "safetyScore": {
      "type": "number",
      "description": "0-100, higher is safer, by the stated method"
    },
    "grade": {
      "type": "string",
      "description": "A (>= 90), B (>= 75), C (>= 60), D (>= 40) or F"
    },
    "verdict": {
      "type": "string",
      "enum": [
        "low_risk",
        "medium_risk",
        "high_risk",
        "critical_risk"
      ],
      "description": "critical_risk when any critical flag stands; otherwise from the score"
    },
    "summary": {
      "type": "string",
      "description": "One sentence: the verdict and its main reason"
    },
    "reasons": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "level": {
            "type": "string"
          },
          "flag": {
            "type": "string"
          },
          "detail": {
            "type": "string"
          },
          "points": {
            "type": "number"
          }
        },
        "required": [
          "level",
          "flag",
          "detail",
          "points"
        ]
      },
      "description": "Everything that took points off the score, worst first — the score is 100 plus their points, clamped to 0-100"
    },
    "positives": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "What speaks for the token (trusted listing, deep liquidity, age, holder count)"
    },
    "trusted": {
      "type": "boolean",
      "description": "True when the scanner lists the token as trusted (its trust list / trusted token)"
    },
    "issuerControls": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Issuer control powers reported but not scored, because the token is trusted or an issuer-run token at its canonical address"
    },
    "scanVerdict": {
      "type": "string",
      "description": "The scan's verdict with no trust applied — safe, caution or danger (on EVM exactly token_safety's)"
    },
    "risks": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "level": {
            "type": "string"
          },
          "flag": {
            "type": "string"
          },
          "detail": {
            "type": "string"
          }
        },
        "required": [
          "level",
          "flag",
          "detail"
        ]
      },
      "description": "The scan's risk flags with no trust applied (on EVM exactly as token_safety reports them; on Solana by this tool's rules)"
    },
    "market": {
      "type": [
        "object",
        "null"
      ],
      "properties": {
        "priceUsd": {
          "type": [
            "number",
            "null"
          ]
        },
        "priceChange24hPct": {
          "type": [
            "number",
            "null"
          ]
        },
        "liquidityUsd": {
          "type": [
            "number",
            "null"
          ]
        },
        "volume24hUsd": {
          "type": [
            "number",
            "null"
          ]
        },
        "fdvUsd": {
          "type": [
            "number",
            "null"
          ]
        },
        "marketCapUsd": {
          "type": [
            "number",
            "null"
          ]
        },
        "dex": {
          "type": [
            "string",
            "null"
          ]
        },
        "pairUrl": {
          "type": [
            "string",
            "null"
          ]
        },
        "pairAgeHours": {
          "type": [
            "number",
            "null"
          ]
        },
        "firstPairAgeHours": {
          "type": [
            "number",
            "null"
          ],
          "description": "Age of the oldest pair the token trades in on this chain, as base or quote — the age the score uses"
        },
        "pairListCut": {
          "type": "boolean",
          "description": "True when DexScreener returned its maximum of 30 pairs, so the oldest seen is a lower bound and the age rule is not applied"
        }
      },
      "required": [
        "priceUsd",
        "priceChange24hPct",
        "liquidityUsd",
        "volume24hUsd",
        "fdvUsd",
        "marketCapUsd",
        "dex",
        "pairUrl",
        "pairAgeHours",
        "firstPairAgeHours",
        "pairListCut"
      ],
      "description": "The deepest DEX pair where this token is the base token (DexScreener); null when none"
    },
    "holders": {
      "type": "object",
      "properties": {
        "count": {
          "type": [
            "number",
            "null"
          ]
        },
        "topHolderPct": {
          "type": [
            "number",
            "null"
          ]
        }
      },
      "required": [
        "count",
        "topHolderPct"
      ],
      "description": "Holder count and the largest holder's share of supply, when the scanner reports them"
    },
    "method": {
      "type": "string",
      "description": "The scoring rules, in full"
    },
    "pageUrl": {
      "type": "string",
      "description": "Public page for this token's last paid verdict on fiatdock.com"
    },
    "source": {
      "type": "string",
      "description": "Where the data comes from"
    },
    "asOf": {
      "type": "string",
      "description": "ISO time of the oldest upstream read this answer used"
    },
    "note": {
      "type": "string",
      "description": "What the verdict is and is not"
    },
    "defaulted": {
      "type": "object",
      "properties": {
        "field": {
          "type": "string"
        },
        "to": {
          "type": "string"
        },
        "value": {
          "type": "string"
        },
        "note": {
          "type": "string"
        }
      },
      "required": [
        "field",
        "to",
        "value",
        "note"
      ],
      "description": "Present only when the body was empty: which subject the answer is for, and why"
    }
  },
  "required": [
    "network",
    "token",
    "name",
    "symbol",
    "safetyScore",
    "grade",
    "verdict",
    "summary",
    "reasons",
    "positives",
    "trusted",
    "issuerControls",
    "scanVerdict",
    "risks",
    "market",
    "holders",
    "method",
    "pageUrl",
    "source",
    "asOf",
    "note"
  ]
}