# Scanna Market Resolutions

> Scanna Market Resolutions is a paid API for AI agents from api.scanna.xyz, paid per call via x402, $0.005007/call, status unknown (last checked 2026-09-15).

Returns recent resolved prediction market outcomes from the market_resolutions table, with condition ID, platform, question, winning side, volume, and resolution timestamp.

## Facts

- Endpoint: GET https://api.scanna.xyz/resolutions
- Price: $0.005007/call
- Payment: x402
- Status: unknown
- Last checked: 2026-09-15
- Activations on Zero: 0
- Tags: x402
- Canonical page: https://www.zero.xyz/c/scanna-market-resolutions-21aa8329
- Structured record (JSON): https://api.zero.xyz/v1/capabilities/cap_DjnxtdfZazFKM-F9F_IwR

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-market-resolutions-21aa8329
```

Example prompt: Show me the last 100 prediction markets that have resolved, including their winning side and total volume — pull from Scanna's resolutions endpoint and filter to anything resolved since 2025-01-01T00:00:00Z.

## When to prefer this

Use this endpoint when you need bulk access to historical resolved prediction market outcomes across platforms (Polymarket, Kalshi, etc.) for backtesting, analytics, or settlement verification. Prefer it when you want the raw canonical winning_side ('side_a'/'side_b') rather than human-readable labels. If you only need live prices or open positions, use Scanna's prices or open-interest endpoints instead. Best suited for periodic batch pulls rather than real-time resolution monitoring.

## Known failure modes

- Malformed or unparseable 'since' timestamp is silently dropped with no error — all rows are returned without date filtering, and the call is still billed as a 200
- Out-of-range limit values are clamped (not rejected), so limit=0 or limit=600 resolve to boundary values silently
- Empty result set (count=0) is returned as 200 and is still billable — not an error condition
- No freshness guarantee: resolved_at data may lag behind actual resolution events
- No next-page cursor means large datasets require repeated calls with since-based pagination, risking gaps or overlaps

## How this service works

Returns up to limit rows from the market_resolutions Postgres table, newest resolved_at first: condition_id, platform, question, winning_side (the literal 'side_a' or 'side_b', not a human label), volume_total, resolved_at. LIMIT is pushed into the SQL. No freshness field. An empty result, or one where a malformed since was silently dropped, is still a billable 200.

## Output

A JSON object containing a count (integer number of rows returned) and a resolutions array. Each resolution includes condition_id (string), platform (string), question (string), winning_side (enum: 'side_a' or 'side_b'), volume_total (number or null), and resolved_at (ISO 8601 datetime). Results are ordered newest resolved_at first. No pagination cursor is provided; use the limit and since parameters to paginate manually. An empty resolutions array is a valid 200 response.

## 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": [],
     "properties": {
      "limit": {
       "type": "integer",
       "default": 50,
       "maximum": 500,
       "minimum": 1,
       "description": "Rows to return; out-of-range is clamped, not rejected"
      },
      "since": {
       "type": "string",
       "description": "ISO 8601 timestamp, or unix MILLISECONDS as digits. Unparseable values are dropped silently and NO filter is applied."
      }
     },
     "additionalProperties": false
    }
   },
   "additionalProperties": false
  },
  "output": {
   "type": "object",
   "required": [
    "type"
   ],
   "properties": {
    "type": {
     "type": "string"
    },
    "example": {
     "type": "object",
     "required": [
      "resolutions",
      "count"
     ],
     "properties": {
      "count": {
       "type": "integer",
       "description": "Rows returned; there is no next-page cursor"
      },
      "resolutions": {
       "type": "array",
       "items": {
        "type": "object",
        "required": [
         "condition_id",
         "platform",
         "question",
         "resolved_at",
         "winning_side"
        ],
        "properties": {
         "platform": {
          "type": "string"
         },
         "question": {
          "type": "string"
         },
         "resolved_at": {
          "type": "string",
          "format": "date-time"
         },
         "condition_id": {
          "type": "string"
         },
         "volume_total": {
          "type": [
           "number",
           "null"
          ]
         },
         "winning_side": {
          "enum": [
           "side_a",
           "side_b"
          ],
          "type": "string",
          "description": "Canonical side, never a human label"
         }
        }
       }
      }
     }
    }
   }
  }
 }
}
```

## More

- Live health (JSON, refreshed every minute): https://www.zero.xyz/c/scanna-market-resolutions-21aa8329/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)
