Skip to content

Resolution

Outcome {
outcome: YES | NO | VOID | PENDING
resolver: provider | admin | oracle | manual | api
resolvedAt, proof (source URL), disputed, disputeReason
}

Every resolver path — venue auto-scan, admin force-resolve, /finalize, the oracle poller — scores through one choke point that claims the market’s outcome once, with provenance. The claim is the canonical record.

  1. update the status of every signal on that market;
  2. trigger scoring, stamping scoring_version and scoring_vertical on every resolved signal;
  3. produce a receipt-like record visible on the surface.
GET /api/resolution/outcome?market=<id> public · the claim, or null
GET /api/resolution/markets?status=open&due=1 public · denpa- markets past cutoff
POST /api/resolution/finalize admin · { marketId, verdict: YES|NO|INVALID, resolver?, source?, proofUrl? }
POST /api/resolution/dispute admin · { marketId, disputed?, reason? }

A disputed market scores nothing further until cleared; existing scores stand. The outcome also rides on /api/network/market/[id] as market.resolution.

Polymarket resolutions are detected from Gamma (resolved, outcomePrices). Weekly sports markets (EPL) auto-resolve. Kalshi and manual markets resolve through the same claim.