Skip to main content
counsel is an L1-native parimutuel prediction market that runs on the XRP Ledger. There is no bridge, no smart contract, and no database of record. The ledger is the registry, the pool, and the audit trail. The price truth (the native XLS-47 oracle), the money (XRP), and the attribution (SourceTag) are all native ledger primitives, so anyone with access to a ledger node can recompute every split from first principles.
Take counsel of your pillow.

How a bet works

You bet by sending a native XRP Payment to a market’s pool account. Two tags carry the meaning:
DestinationTag
integer
The outcome index you are backing.
SourceTag
integer
counsel’s attribution tag, which marks the Payment as a counsel bet.
You sign that Payment yourself, in your own wallet (Xaman, GemWallet, or Crossmark). counsel constructs the unsigned Payment and returns it; your wallet signs and submits it. counsel never holds, requests, or touches your private key.

Parimutuel pools

Bettors stake into outcome pools. When the market resolves, the participants on the winning side split the entire pool, including the losing stakes, after a flat 3% protocol fee. There is no order book and no counterparty matching. The pool itself is the market, and the pool is the odds. The payout formula is exact:
SymbolMeaning
TGross pool, the sum of all stakes across all outcomes
rFee rate, typically 0.03
WTotal staked on the winning outcome
sᵢAn individual winning stake
N        = T × (1 − r)         net pool after the 3% takeout
payoutᵢ  = floor(sᵢ × N / W)    rounded down to whole XRP drops
dust     = N − Σ payoutᵢ        rounding residue, to operator reserve
The fee is taken from the whole gross pool before the split. It is never applied selectively on winners’ returns.

Indicative odds and the final line

counsel shows a live tote board. While a market is open, each outcome displays an indicative implied probability and an indicative payout per unit, recomputed in real time as XRP flows in:
  • implied_prob = outcome_drops / total_drops
  • payout_per_unit = indicative XRP returned per 1 XRP staked if that outcome wins, after the fee
These figures are indicative only. Because counsel is a true parimutuel market and not fixed-odds, every new stake shifts every outcome’s odds. The final line is set by the pool state at bet_cutoff. An early bettor cannot lock a price seen before close.

Resolution

Markets resolve in one of two ways, by family.

Family A: crypto price

Resolves automatically against the native XLS-47 price oracle.

Family B: real world

Resolves by an operator-proposed outcome, then a bonded dispute window, then a multisig committee finalization.

Voided pools

A pool is voided and fully refunded, with no fee taken, when it cannot resolve cleanly. This covers a one-sided pool (no losing side to split), a market with no winner, a cancelled event, and a stale oracle. In every void case, stakes are returned in full.

Fully on-chain and verifiable

Every action in counsel’s lifecycle leaves an on-chain trace:
  • Market definitions are JSON memos on a Payment to the registry account.
  • Bets are tagged XRP Payments (DestinationTag = outcome index, SourceTag = counsel attribution).
  • Resolutions are published as memos referencing the oracle value or evidence hash.
  • Payouts are committee-multisigned XRP Payments with a payout memo attached.
The application rebuilds its entire state from the ledger. There is no database of record, so anyone can verify a payout split by reading the same transactions.

Trust model

counsel is custodial-transparent, not trustless. Stakes sit in per-market pool accounts secured by a multisig SignerList with the master key disabled. No single key can move funds from a pool: settlement requires a committee threshold of signatures. Everything is on-chain and recomputable, so the custody is transparent and auditable even though it is not fully trustless.

The canonical developer path

Bots are first-class in counsel. A bot is an ordinary XRPL client: it reads a market, fetches an unsigned bet Payment, signs it with its own key, and submits it. The public API is read-only REST with no API key.
1

Find a market and outcome

GET /markets lists open markets and their outcome indices.
2

Fetch an unsigned bet intent

GET /markets/:id/bet-intent?account=...&outcome=...&amount=... returns an unsigned XRPL Payment plus the projected odds after your stake.
3

Sign it in your own wallet

Sign the returned Payment with your own key. counsel never sees it.
4

Submit it to the XRPL

Submit the signed Payment. The pool updates and the tote board moves.
curl https://api.counsel.markets/markets

What you can do

  • Bet on markets: open crypto-price and real-world markets at counsel.markets.
  • Copy-trade: mirror a leader’s open bets non-custodially. You sign each mirror in your own wallet, sized to your own stake, with projected odds shown before you sign.
  • Run bots: the public API returns unsigned bet Payments with projected post-stake odds, and a bot is an ordinary XRPL client.

Next steps

How it works

The bet, close, resolve, and payout lifecycle, with oracle and multisig mechanics.

Place a bet

Connect a wallet, select an outcome, and submit a bet Payment.

API reference

Read-only REST endpoints for markets, positions, feeds, profiles, and the leaderboard.

counsel-js SDK

Fetch an unsigned intent, sign with your own key, and submit.

Copy trading

Mirror a leader’s open bets non-custodially, sized to your own stake.

Discord

Ask questions and follow development with the counsel community.