api.scanna.xyz
api.scanna.xyz
· api.scanna.xyz
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.
api.scanna.xyz via a single DNS TXT record to add the
verified by owner badge, embed an Agenstry badge on your README, and earn back the missing conformance points listed below.
Dispute or improve this rating
F
Conformance score: 34/100
F-grade: card is reachable but fails most operational signals.
click to expand breakdown ▾
click to collapse breakdown ▴
agent-card.json changed within the last 7 days. We track these so downstream callers can react.
Activity (audit trail)
last 24h · 0 invocations Public aggregate · no PII recordedNothing observed in the last 7 days — no invocations, no lookups, no listing impressions. Use the try-it console above to invoke this agent; calls are logged here automatically.
Endpoints
| Endpoint | Price | Currency |
|---|---|---|
https://api.scanna.xyz/catalog/events
|
0.010014 | USDC |
https://api.scanna.xyz/data/series
|
0.010009 | USDC |
https://api.scanna.xyz/heat
|
0.010001 | USDC |
https://api.scanna.xyz/hot
|
0.010002 | USDC |
https://api.scanna.xyz/insider-score
|
0.020013 | USDC |
https://api.scanna.xyz/leaderboard
|
0.010012 | USDC |
https://api.scanna.xyz/live-predict
|
0.050011 | USDC |
https://api.scanna.xyz/markets
|
0.005005 | USDC |
https://api.scanna.xyz/matched-market-clusters
|
0.010008 | USDC |
https://api.scanna.xyz/open-interest
|
0.010016 | USDC |
https://api.scanna.xyz/price-compare
|
0.010017 | USDC |
https://api.scanna.xyz/prices
|
0.005006 | USDC |
https://api.scanna.xyz/resolutions
|
0.005007 | USDC |
https://api.scanna.xyz/risk-score
|
0.02001 | USDC |
https://api.scanna.xyz/smart-money
|
0.020003 | USDC |
https://api.scanna.xyz/trades
|
0.005015 | USDC |
0xfca7d3b52d69b9b8371dd5765d3f294e46a4f59e · basescan ↗
eth_getLogs on USDC Transfer events to the payment wallet.
single_payer_observed
2/5
Payer identities observed; a single payer accounts for effectively all observed volume.
single_day_concentration —
Most observed volume landed on a single day of the window.
daily_volume_aggregate, active_day_cadence, amount_regularity, spike_concentration, settlement_wallet_overlap, payer_uniqueness, payer_concentration, payer_recurrence, payer_payee_overlap.
Derived from agent_revenue_daily, agents.payment_wallet, agent_payment_transactions.
Measured 2026-08-19.
get_agent_full and
payment_intelligence skills
on REST, A2A and MCP. API docs →
| Agent card | https://api.scanna.xyz |
| Provider | https://api.scanna.xyz |
| Docs | https://api.scanna.xyz |
Health · last 0 probes
Similar agents embedding-nearest
Embed your Agenstry badge
Paste any of these into your README, agent card, or marketing page. Each badge auto-updates and links back to this page.
Markdown / HTML snippets
[](https://agenstry.com/agents/api.scanna.xyz) [](https://agenstry.com/agents/api.scanna.xyz) [](https://agenstry.com/agents/api.scanna.xyz) [](https://agenstry.com/agents/api.scanna.xyz)
Audit-grade evidence bundle
JSON snapshot for vendor-review files. Add ?sign=true for a JWS-signed envelope verifiable against
our JWKS. See the methodology.
Raw agent card JSON
{
"_source": "agentic.market",
"service": {
"id": "api-scanna-xyz",
"name": "api.scanna.xyz",
"description": "",
"domain": "api.scanna.xyz",
"provider": "api.scanna.xyz",
"providerUrl": "",
"category": "",
"networks": [
"Base"
],
"enriched": false,
"endpoints": [
{
"url": "https://api.scanna.xyz/catalog/events",
"description": "Cross-venue event catalog with free-text search (q), venue and status filters, and limit/offset paging pushed into SQL. Search uses a trigram index on title; if that index is absent or INVALID it falls back to a bounded ILIKE, so search stays bounded either way. total is CAPPED for display: 10000 means at least 10000, not exactly. Unknown venue is 400 BAD_VENUE. No match returns total 0 and an empty, billable 200.",
"pricing": {
"amount": "0.010014",
"currency": "USDC",
"network": "eip155:8453",
"scheme": "exact",
"maxAmount": "",
"minAmount": ""
},
"method": "GET",
"providerName": "",
"parameters": [
{
"group": "query",
"name": "limit",
"type": "number",
"description": "",
"example": 10,
"enumValues": [],
"default": null,
"required": false
},
{
"group": "query",
"name": "q",
"type": "string",
"description": "",
"example": "bitcoin",
"enumValues": [],
"default": null,
"required": false
},
{
"group": "query",
"name": "status",
"type": "string",
"description": "",
"example": "active",
"enumValues": [],
"default": null,
"required": false
}
],
"serviceName": "Scanna",
"tags": [
"prediction-markets",
"catalog",
"cross-venue",
"search",
"events"
],
"quality": {
"l30DaysTotalCalls": "1",
"l30DaysUniquePayers": "1"
}
},
{
"url": "https://api.scanna.xyz/data/series",
"description": "Returns the full enrichment-series catalog from Postgres: one row per (provider, series_id) with dataset, title, unit, first/last date and observation count. No params, no filtering, fixed ORDER BY. Data refreshes on a 6h worker tick and is cached 30 min (Cache-Control private). An empty catalog (no DB pool at boot, or enrichment dark) still returns 200 and bills.",
"pricing": {
"amount": "0.010009",
"currency": "USDC",
"network": "eip155:8453",
"scheme": "exact",
"maxAmount": "",
"minAmount": ""
},
"method": "GET",
"providerName": "",
"parameters": [],
"serviceName": "Scanna",
"tags": [
"macro-data",
"time-series",
"enrichment",
"economics",
"catalog"
],
"quality": {
"l30DaysTotalCalls": "1",
"l30DaysUniquePayers": "1"
}
},
{
"url": "https://api.scanna.xyz/heat",
"description": "Full signal breakdown for one prediction market on Polymarket or Kalshi: heat score, volume-spike multiplier, lookback and 24h volume, liquidity, order-flow bias and score, volatility, whale activity, and both YES and NO prices. POST a market_id, taken from any GET /hot entry, optionally with a custom lookback window. Computed signal, not raw odds. Billed on success. JSON.",
"pricing": {
"amount": "0.010001",
"currency": "USDC",
"network": "eip155:8453",
"scheme": "exact",
"maxAmount": "",
"minAmount": ""
},
"method": "POST",
"providerName": "",
"parameters": [
{
"group": "body",
"name": "lookback_minutes",
"type": "number",
"description": "",
"example": 240,
"enumValues": [],
"default": null,
"required": false
},
{
"group": "body",
"name": "market_id",
"type": "string",
"description": "",
"example": "0x1f2a...c9",
"enumValues": [],
"default": null,
"required": false
}
],
"serviceName": "Scanna",
"tags": [
"prediction-markets",
"market-data",
"order-flow",
"kalshi",
"analytics"
],
"quality": {
"l30DaysTotalCalls": "1",
"l30DaysUniquePayers": "1"
}
},
{
"url": "https://api.scanna.xyz/hot",
"description": "Ranked feed of the most active prediction markets across Polymarket and Kalshi. Each entry carries a composite heat score plus the components behind it: 24h volume, volume-spike multiplier, liquidity, order-flow bias, whale activity and current YES price. Filter by category, platform or minimum volume. Served from a cached feed; updated_at is its age. Billed on success, including an empty result. JSON.",
"pricing": {
"amount": "0.010002",
"currency": "USDC",
"network": "eip155:8453",
"scheme": "exact",
"maxAmount": "",
"minAmount": ""
},
"method": "GET",
"providerName": "",
"parameters": [
{
"group": "query",
"name": "category",
"type": "string",
"description": "",
"example": "politics",
"enumValues": [],
"default": null,
"required": false
},
{
"group": "query",
"name": "limit",
"type": "number",
"description": "",
"example": 5,
"enumValues": [],
"default": null,
"required": false
},
{
"group": "query",
"name": "min_volume",
"type": "number",
"description": "",
"example": 50000,
"enumValues": [],
"default": null,
"required": false
}
],
"serviceName": "Scanna",
"tags": [
"prediction-markets",
"market-data",
"polymarket",
"kalshi",
"analytics"
],
"quality": {
"l30DaysTotalCalls": "1",
"l30DaysUniquePayers": "1"
}
},
{
"url": "https://api.scanna.xyz/insider-score",
"description": "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.",
"pricing": {
"amount": "0.020013",
"currency": "USDC",
"network": "eip155:8453",
"scheme": "exact",
"maxAmount": "",
"minAmount": ""
},
"method": "GET",
"providerName": "",
"parameters": [
{
"group": "query",
"name": "wallet",
"type": "string",
"description": "",
"example": "0x9a7c...f1",
"enumValues": [],
"default": null,
"required": false
}
],
"serviceName": "Scanna",
"tags": [
"prediction-markets",
"smart-money",
"risk",
"wallet",
"analytics"
],
"quality": {
"l30DaysTotalCalls": "1",
"l30DaysUniquePayers": "1"
}
},
{
"url": "https://api.scanna.xyz/leaderboard",
"description": "Top Polymarket traders by realised PnL or volume. Normally a 5-minute shared cache, but if upstream fails we serve the last good copy for UP TO 24 HOURS, still as a 200, signalled only by the X-Data-Freshness header. 503 only when nothing is cached at all. Upstream rows are sparse: proxy_wallet is the only guaranteed field; pnl and volume can be null and trades can be absent. limit is truncated locally before enrichment, so it bounds work. Empty bills.",
"pricing": {
"amount": "0.010012",
"currency": "USDC",
"network": "eip155:8453",
"scheme": "exact",
"maxAmount": "",
"minAmount": ""
},
"method": "GET",
"providerName": "",
"parameters": [
{
"group": "query",
"name": "limit",
"type": "number",
"description": "",
"example": 10,
"enumValues": [],
"default": null,
"required": false
},
{
"group": "query",
"name": "order",
"type": "string",
"description": "",
"example": "PNL",
"enumValues": [],
"default": null,
"required": false
}
],
"serviceName": "Scanna",
"tags": [
"prediction-markets",
"smart-money",
"polymarket",
"leaderboard",
"analytics"
],
"quality": {
"l30DaysTotalCalls": "1",
"l30DaysUniquePayers": "1"
}
},
{
"url": "https://api.scanna.xyz/live-predict",
"description": "One market_id in, one live CatBoost probability out, plus market_price, divergence and a ~28-field feature snapshot. Features come from the worker-maintained DB serving state, not request-time compute, and snapshot_at is stamped at request time, so stale state looks fresh. Confidence band often nulls to unavailable. No empty 200: missing data is a 404.",
"pricing": {
"amount": "0.050011",
"currency": "USDC",
"network": "eip155:8453",
"scheme": "exact",
"maxAmount": "",
"minAmount": ""
},
"method": "GET",
"providerName": "",
"parameters": [
{
"group": "query",
"name": "market_id",
"type": "string",
"description": "",
"example": "0x1f2a...c9",
"enumValues": [],
"default": null,
"required": false
}
],
"serviceName": "Scanna",
"tags": [
"prediction-markets",
"machine-learning",
"forecasting",
"live-model",
"analytics"
],
"quality": {
"l30DaysTotalCalls": "1",
"l30DaysUniquePayers": "1"
}
},
{
"url": "https://api.scanna.xyz/markets",
"description": "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.",
"pricing": {
"amount": "0.005005",
"currency": "USDC",
"network": "eip155:8453",
"scheme": "exact",
"maxAmount": "",
"minAmount": ""
},
"method": "GET",
"providerName": "",
"parameters": [
{
"group": "query",
"name": "category",
"type": "string",
"description": "",
"example": "politics",
"enumValues": [],
"default": null,
"required": false
},
{
"group": "query",
"name": "limit",
"type": "number",
"description": "",
"example": 25,
"enumValues": [],
"default": null,
"required": false
},
{
"group": "query",
"name": "min_volume",
"type": "number",
"description": "",
"example": 10000,
"enumValues": [],
"default": null,
"required": false
},
{
"group": "query",
"name": "platform",
"type": "string",
"description": "",
"example": "polymarket",
"enumValues": [],
"default": null,
"required": false
}
],
"serviceName": "Scanna",
"tags": [
"prediction-markets",
"market-data",
"polymarket",
"kalshi",
"pagination"
],
"quality": {
"l30DaysTotalCalls": "3",
"l30DaysUniquePayers": "3"
}
},
{
"url": "https://api.scanna.xyz/matched-market-clusters",
"description": "Cross-venue matched market clusters from Postgres: cluster row, member markets with outcomes, optional related/raw edges. LIMIT/OFFSET pushed into SQL (max 100). Served matches are LLM-verified and stay valid, but COVERAGE can be incomplete: adjudication is a separate gated step and while paused no new match is promoted - see `freshness`. An empty page is a billable 200.",
"pricing": {
"amount": "0.010008",
"currency": "USDC",
"network": "eip155:8453",
"scheme": "exact",
"maxAmount": "",
"minAmount": ""
},
"method": "GET",
"providerName": "",
"parameters": [
{
"group": "query",
"name": "limit",
"type": "number",
"description": "",
"example": 5,
"enumValues": [],
"default": null,
"required": false
},
{
"group": "query",
"name": "min_confidence",
"type": "number",
"description": "",
"example": 0.75,
"enumValues": [],
"default": null,
"required": false
},
{
"group": "query",
"name": "offset",
"type": "number",
"description": "",
"example": 0,
"enumValues": [],
"default": null,
"required": false
},
{
"group": "query",
"name": "venue",
"type": "string",
"description": "",
"example": "kalshi",
"enumValues": [],
"default": null,
"required": false
}
],
"serviceName": "Scanna",
"tags": [
"prediction-markets",
"cross-venue",
"market-matching",
"kalshi",
"polymarket"
],
"quality": {
"l30DaysTotalCalls": "1",
"l30DaysUniquePayers": "1"
}
},
{
"url": "https://api.scanna.xyz/open-interest",
"description": "Open interest in USD. Omit market_id for the platform-wide aggregate, or pass a Polymarket condition id (0x + 64 hex) to scope it to one market. Anything else - empty, whitespace, a repeated or bracketed parameter, or the literal GLOBAL - is 400, not silently answered as an aggregate. A well-formed id upstream does not know is 404, never an empty 200. 60-second shared cache; a stale read is disclosed on X-Data-Freshness and still served.",
"pricing": {
"amount": "0.010016",
"currency": "USDC",
"network": "eip155:8453",
"scheme": "exact",
"maxAmount": "",
"minAmount": ""
},
"method": "GET",
"providerName": "",
"parameters": [],
"serviceName": "Scanna",
"tags": [
"prediction-markets",
"open-interest",
"polymarket",
"market-data",
"analytics"
],
"quality": {
"l30DaysTotalCalls": "1",
"l30DaysUniquePayers": "1"
}
},
{
"url": "https://api.scanna.xyz/price-compare",
"description": "Verified cross-venue market pairs, both venues books side by side, market_b transformed into market_as YES claim space. Each leg carries observed_at (when that venue response arrived), age_seconds and stale; each pair carries observation_skew_seconds - how far apart the two prices were really read, null (never 0) when unknown. Stale pairs are LABELLED and sorted last, not dropped. coverage publishes fresh/stale counts and the bound.",
"pricing": {
"amount": "0.010017",
"currency": "USDC",
"network": "eip155:8453",
"scheme": "exact",
"maxAmount": "",
"minAmount": ""
},
"method": "GET",
"providerName": "",
"parameters": [
{
"group": "query",
"name": "limit",
"type": "number",
"description": "",
"example": 10,
"enumValues": [],
"default": null,
"required": false
}
],
"serviceName": "Scanna",
"tags": [
"prediction-markets",
"cross-venue",
"polymarket",
"kalshi",
"market-data"
],
"quality": {
"l30DaysTotalCalls": "1",
"l30DaysUniquePayers": "1"
}
},
{
"url": "https://api.scanna.xyz/prices",
"description": "Returns yes/no prices for up to 50 condition_ids, read from an in-process market cache; no DB or upstream call. Prices are up to ~60s stale (updated_at is the cache refresh time). Unknown or long-tail ids return found:false with null prices in a 200, so an all-null response is still billable. 503 when the cache is not hydrated.",
"pricing": {
"amount": "0.005006",
"currency": "USDC",
"network": "eip155:8453",
"scheme": "exact",
"maxAmount": "",
"minAmount": ""
},
"method": "GET",
"providerName": "",
"parameters": [
{
"group": "query",
"name": "ids",
"type": "string",
"description": "",
"example": "0x1f2a...c9,0x77b1...04",
"enumValues": [],
"default": null,
"required": false
}
],
"serviceName": "Scanna",
"tags": [
"prediction-markets",
"market-data",
"prices",
"polymarket",
"kalshi"
],
"quality": {
"l30DaysTotalCalls": "2",
"l30DaysUniquePayers": "2"
}
},
{
"url": "https://api.scanna.xyz/resolutions",
"description": "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.",
"pricing": {
"amount": "0.005007",
"currency": "USDC",
"network": "eip155:8453",
"scheme": "exact",
"maxAmount": "",
"minAmount": ""
},
"method": "GET",
"providerName": "",
"parameters": [
{
"group": "query",
"name": "limit",
"type": "number",
"description": "",
"example": 25,
"enumValues": [],
"default": null,
"required": false
},
{
"group": "query",
"name": "since",
"type": "string",
"description": "",
"example": "2026-07-01T00:00:00Z",
"enumValues": [],
"default": null,
"required": false
}
],
"serviceName": "Scanna",
"tags": [
"prediction-markets",
"resolutions",
"outcomes",
"polymarket",
"kalshi"
],
"quality": {
"l30DaysTotalCalls": "1",
"l30DaysUniquePayers": "1"
}
},
{
"url": "https://api.scanna.xyz/risk-score",
"description": "Returns a 6-factor A-F risk grade for one market_id from in-memory caches only: no DB, no upstream call, no write. Market data is up to ~60s stale; order-book depth covers only the top ~100 Polymarket markets, so most ids (and all Kalshi) score with placeholder spread/category factors. Unknown id is 404, but a placeholder-heavy score still returns 200 and bills.",
"pricing": {
"amount": "0.02001",
"currency": "USDC",
"network": "eip155:8453",
"scheme": "exact",
"maxAmount": "",
"minAmount": ""
},
"method": "GET",
"providerName": "",
"parameters": [
{
"group": "query",
"name": "market_id",
"type": "string",
"description": "",
"example": "0x1f2a...c9",
"enumValues": [],
"default": null,
"required": false
}
],
"serviceName": "Scanna",
"tags": [
"prediction-markets",
"risk",
"market-quality",
"polymarket",
"analytics"
],
"quality": {
"l30DaysTotalCalls": "1",
"l30DaysUniquePayers": "1"
}
},
{
"url": "https://api.scanna.xyz/smart-money",
"description": "Leaderboard of Polymarket wallets ranked by realised win rate across resolved markets. Each entry returns the wallet address, win rate, resolved trade count, profit and loss in USD, total notional traded, and when it was last active. Filter by minimum trades or win rate; defaults restrict to 10+ resolved trades and a 60% win rate. Polymarket only: Kalshi has no wallet-level identity. Billed on success, including an empty result. JSON.",
"pricing": {
"amount": "0.020003",
"currency": "USDC",
"network": "eip155:8453",
"scheme": "exact",
"maxAmount": "",
"minAmount": ""
},
"method": "GET",
"providerName": "",
"parameters": [
{
"group": "query",
"name": "limit",
"type": "number",
"description": "",
"example": 20,
"enumValues": [],
"default": null,
"required": false
},
{
"group": "query",
"name": "min_trades",
"type": "number",
"description": "",
"example": 25,
"enumValues": [],
"default": null,
"required": false
},
{
"group": "query",
"name": "min_win_rate",
"type": "number",
"description": "",
"example": 0.65,
"enumValues": [],
"default": null,
"required": false
}
],
"serviceName": "Scanna",
"tags": [
"prediction-markets",
"smart-money",
"polymarket",
"trading",
"analytics"
],
"quality": {
"l30DaysTotalCalls": "1",
"l30DaysUniquePayers": "1"
}
},
{
"url": "https://api.scanna.xyz/trades",
"description": "Recent trades for one market from the post-cutover trades_v2 table, newest first, keyset cursor. timestamp is whole unix seconds and the cursor is {ts,id}; the query sorts on that same floored key, so trades sharing a second page exactly once. id is a JSON number. An archived market returns 503 trades_cold_storage - unless the archive probe itself errors, which degrades to an empty 200. A market with no trades is an empty, billable 200.",
"pricing": {
"amount": "0.005015",
"currency": "USDC",
"network": "eip155:8453",
"scheme": "exact",
"maxAmount": "",
"minAmount": ""
},
"method": "GET",
"providerName": "",
"parameters": [
{
"group": "query",
"name": "limit",
"type": "number",
"description": "",
"example": 20,
"enumValues": [],
"default": null,
"required": false
},
{
"group": "query",
"name": "market_id",
"type": "string",
"description": "",
"example": "0x1f2a...c9",
"enumValues": [],
"default": null,
"required": false
}
],
"serviceName": "Scanna",
"tags": [
"prediction-markets",
"trades",
"polymarket",
"market-data",
"pagination"
],
"quality": {
"l30DaysTotalCalls": "1",
"l30DaysUniquePayers": "1"
}
}
],
"integrationType": "",
"isNew": false,
"priceSummary": {
"minAmount": "0.005005",
"maxAmount": "0.050011",
"avgCostPerTransaction": "0.013134",
"avgCostBasis": "exact",
"currency": "USDC"
},
"serviceName": "Scanna",
"tags": [
"prediction-markets",
"catalog",
"cross-venue",
"search",
"events",
"macro-data",
"time-series",
"enrichment",
"economics",
"market-data",
"order-flow",
"kalshi",
"analytics",
"polymarket",
"smart-money",
"risk",
"wallet",
"leaderboard",
"machine-learning",
"forecasting",
"live-model",
"pagination",
"market-matching",
"open-interest",
"prices",
"resolutions",
"outcomes",
"market-quality",
"trading",
"trades"
],
"iconUrl": ""
}
}