# Scanna Markets Feed

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

Returns a paginated, filtered, and volume-sorted snapshot of the combined Polymarket and Kalshi prediction market universe from an in-memory cache refreshed every ~60 seconds.

## Facts

- Endpoint: GET https://api.scanna.xyz/markets
- Price: $0.005005/call
- Payment: x402
- Status: unknown
- Last checked: 2026-09-15
- Activations on Zero: 0
- Tags: x402
- Canonical page: https://www.zero.xyz/c/scanna-markets-feed-b3fef331
- Structured record (JSON): https://api.zero.xyz/v1/capabilities/cap_Cw6oplH092pzqa4PrCSM8

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-markets-feed-b3fef331
```

Example prompt: Show me the top 100 Polymarket markets in the politics category with at least $5000 in 24h volume, sorted by volume.

## When to prefer this

Choose this endpoint when you need a broad, multi-venue view of prediction markets sorted by 24h volume without requiring real-time data (up to 5 min stale is acceptable). It is ideal for browsing, discovery, and filtering across the combined Polymarket+Kalshi universe in a single call. Prefer this over individual venue APIs when you want cross-platform aggregation, low-latency in-memory responses, and cursor-based pagination over large result sets. Not suitable when you need real-time prices for specific markets (use the prices endpoint) or trade history (use the trades endpoint).

## Known failure modes

- 503 returned when cache is more than 5 minutes stale (worker down)
- Empty 200 response (count=0) when filters match no markets — still billable
- Cursor value unparseable — silently falls back to page 1 instead of erroring
- limit out of range is clamped silently (1–500), not rejected
- Platform values other than 'polymarket' or 'kalshi' are ignored, returning all platforms

## How this service works

Serves the in-memory Polymarket+Kalshi market universe (worker-refreshed ~60s; up to 5 min stale before the gate 503s). Filters and sorts the WHOLE cached universe by volume_24h, then slices: limit trims output, not work. Zero DB and zero upstream calls in the request path. Empty pages (filters matching nothing, cursor past end) return 200 and are billable.

## Output

A JSON object containing an array of market objects (question, condition_id, slug, platform, outcome prices, active/closed flags, volume_24h, volume_total, liquidity, end_date, tags, winning_side), plus page metadata: count (rows in this page), total (matches before cursor slice), updated_at (cache timestamp), next_cursor (for pagination), and optional _meta upsell pointers.

## 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": "Page size; out-of-range is clamped, not rejected"
      },
      "cursor": {
       "type": "string",
       "description": "Opaque next_cursor from the previous page; an unparseable value is ignored and page 1 is served"
      },
      "category": {
       "type": "string",
       "description": "Case-insensitive SUBSTRING match against a market's tags"
      },
      "platform": {
       "enum": [
        "polymarket",
        "kalshi"
       ],
       "type": "string",
       "description": "Restrict to one venue; any other value is ignored"
      },
      "min_volume": {
       "type": "integer",
       "default": 0,
       "minimum": 0,
       "description": "Minimum 24h volume in USD; parsed as an integer and clamped"
      }
     },
     "additionalProperties": false
    }
   },
   "additionalProperties": false
  },
  "output": {
   "type": "object",
   "required": [
    "type"
   ],
   "properties": {
    "type": {
     "type": "string"
    },
    "example": {
     "type": "object",
     "required": [
      "markets",
      "count",
      "total",
      "updated_at"
     ],
     "properties": {
      "_meta": {
       "type": "object",
       "description": "Upsell pointers; not part of the data contract"
      },
      "count": {
       "type": "integer",
       "description": "Rows in THIS page"
      },
      "total": {
       "type": "integer",
       "description": "Matches after filtering, BEFORE the cursor slice"
      },
      "markets": {
       "type": "array",
       "items": {
        "type": "object",
        "required": [
         "condition_id",
         "slug",
         "question",
         "platform",
         "outcome_prices",
         "active",
         "closed",
         "volume_24h",
         "volume_total",
         "liquidity",
         "end_date",
         "tags",
         "winning_side"
        ],
        "properties": {
         "slug": {
    
… (truncated)
```

## More

- Live health (JSON, refreshed every minute): https://www.zero.xyz/c/scanna-markets-feed-b3fef331/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)
