Skip to content

Core concepts

Oracle

The oracle is SatoriEx's transparent settlement surface. Three public endpoints let anyone โ€” users, builders, journalists, auditors โ€” verify every pending and finalized resolution without an account, an API key, or trust in our word.

Looking for the conceptual story?

If you want to understand what resolution means as a platform feature โ€” stages, dispute window, payout โ€” read the Resolution concept page first. Read: Resolution & settlement

Coming from Polymarket?

Polymarket's resolution uses UMA's Optimistic Oracle โ€” anyone can propose with a $750 bond, anyone can dispute, escalations route to a DVM token-holder vote. SatoriEx uses an optimistic-bonded model with similar mechanics scaled for our market: any KYC-verified user can propose an outcome under bond, anyone can file a $10 dispute (refunded + $5 reward if upheld), and a tier-2 escalation routes to an independent voter panel โ€” not the original proposer โ€” for the final decision. Public endpoints make every step auditable, and the proposer's bond is slashed to the dispute reserve when an upheld escalation overturns the outcome.

Why a public surface

Prediction markets only work if traders can verify outcomes themselves. We publish the full resolution pipeline so you can audit every decision. Outcomes are proposed under bond by a KYC-verified user, exposed via public read endpoints during a 2-hour dispute window, and auto-finalised if no one disputes. If a dispute upholds and escalates, the final outcome is decided by a panel of voters โ€” every step is queryable on-chain-style through the oracle endpoints.

  • Anyone can list markets currently in the dispute window and read the proposed winner.
  • Anyone can list markets that closed but have not yet been resolved โ€” useful for watchdogs.
  • Anyone can list every resolved and settled market in history, with the winning outcome attached.

Public endpoints

Three GET endpoints carry the entire transparency surface. None require authentication. All paginate with the standard page and size parameters; results are filterable by category and search query.

EndpointReturnsUse case
GET /oracle/proposeActive markets past their close time, awaiting a winner proposal.Watch for markets that should resolve soon.
GET /oracle/verifyMarkets in the 2-hour dispute window with their proposed winner.Audit pending resolutions; file a dispute if you disagree.
GET /oracle/settledResolved and settled markets, with winning outcome and resolution timestamp.Historical record for analytics, reporting, or third-party feeds.
# All three endpoints are public โ€” no auth required.
curl https://staging.satoriex.io/api/v1/oracle/verify?page=1&size=50
curl https://staging.satoriex.io/api/v1/oracle/propose
curl https://staging.satoriex.io/api/v1/oracle/settled?category=politics

These endpoints are intentionally cacheable. Watchdog services typically poll /verify every few minutes during dispute windows.

Response shape

All three endpoints return the same envelope โ€” a paginated list of markets, each with its outcomes, current price, dispute count, and dispute end time. Field names match the underlying market model.

{
  "code": 0,
  "data": {
    "markets": [{
      "id": "mkt_01H...",
      "title": "Will the central bank cut rates in May?",
      "status": "resolved",
      "winning_outcome_id": "out_01H...",
      "resolved_at": "2026-05-08T14:02:31Z",
      "dispute_end_time": "2026-05-09T14:02:31Z",
      "dispute_count": 0,
      "outcomes": [{ "id": "out_01H...", "label": "Yes", "price_bps": 7400 }]
    }],
    "total": 1247,
    "page": 1,
    "size": 50
  }
}

The resolution action

Reading the oracle is open. Acting on it is not. The single mutating endpoint, POST /oracle/resolve, accepts a winning outcome and an HMAC-SHA256 signature over the resolution payload.

POST /api/v1/oracle/resolve
Content-Type: application/json

{
  "market_id":           "mkt_01H...",
  "winning_outcome_id":  "out_01H...",
  "timestamp":           "2026-05-11T14:02:31Z",
  "signature":           "<HMAC-SHA256 over: market_id:winning_outcome_id:unix_ts>"
}

# Signature pre-image uses ':' as delimiter and the unix epoch
# seconds form of timestamp. Requests older than 5 minutes are
# rejected as replay-suspect.
  • Requires a server-side shared secret โ€” never expose the signing key in client code.
  • Signature pre-image is `market_id:winning_outcome_id:unix_ts`. Requests older than 5 minutes are rejected as replay-suspect.
  • Only the server-side oracle service can produce a valid signature โ€” the signing key never leaves the server, and it is held by SatoriEx super-admins.
  • Two-person approval still applies โ€” see the Resolution concept page for the full lifecycle.

Trust model at a glance

Different actions require different privileges. Anything you can read is public; anything you can write requires a bonded user account โ€” proposing an outcome locks the proposer's bond, and filing a dispute locks the disputer's bond. Both bonds settle predictably from the outcome of the dispute window or voter panel.

CapabilityWho can do this
Read pending and settled resolutions Anyone โ€” no account required
Read open disputes against any resolution Anyone โ€” no account required
File a dispute against a proposed resolution Any user with a $10 USDC bond
Propose a winning outcome for a market Moderator or higher (first proposer)
Confirm a proposed resolution A separate admin (or higher) โ€” different from the proposer

Two-person approval is enforced server-side. The same admin account cannot both propose and confirm.

Related

For the conceptual lifecycle โ€” halt, propose, approve, dispute window, settle โ€” see: Resolution & settlement