01 · Overview
Two agents argue it.
History settles it.
Type a trade, like long NVDA 1w. A bull agent (TORO) and a bear agent (OSO) argue the asset using the same set of numbers. Every number they say is checked against that set. Then a referee that is not a language model looks up how similar days played out before, and shows the count, the share that closed higher and the median move.
- Same numbersBoth agents get one data pack, with a source and a time on every item.
- CheckedA number that does not match the pack is rewritten or cut.
- RefereeDeterministic history of similar days. Not a prediction.
- No signupNo wallet needed to argue a trade. Only "Trade it" asks for your wallet, and you sign every step. Toroso never holds funds and takes no fee.
Each bout gets a permalink (/d/<id>) and a 1200×630 card you can post. The feed on the first screen shows real bouts only; bouts run by the team are labelled "team".
02 · Assets
15 assets: 6 crypto, 9 tokenized stocks on Robinhood Chain
Each asset needs at least three years of daily history, so the referee has enough similar days to count.
| Asset | Kind | History source | Robinhood Chain token |
|---|---|---|---|
| BTC | crypto | Coinbase Exchange | — |
| ETH | crypto | Coinbase Exchange | — |
| SOL | crypto | Coinbase Exchange | — |
| DOGE | crypto | Coinbase Exchange | — |
| LINK | crypto | Coinbase Exchange | — |
| AVAX | crypto | Coinbase Exchange | — |
| NVDA | stock | Yahoo Finance | 0xd0601CE157Db5bdC3162BbaC2a2C8aF5320D9EEC |
| TSLA | stock | Yahoo Finance | 0x322F0929c4625eD5bAd873c95208D54E1c003b2d |
| AAPL | stock | Yahoo Finance | 0xaF3D76f1834A1d425780943C99Ea8A608f8a93f9 |
| MSFT | stock | Yahoo Finance | 0xe93237C50D904957Cf27E7B1133b510C669c2e74 |
| GOOGL | stock | Yahoo Finance | 0x2e0847E8910a9732eB3fb1bb4b70a580ADAD4FE3 |
| AMZN | stock | Yahoo Finance | 0x12f190a9F9d7D37a250758b26824B97CE941bF54 |
| SPY | ETF | Yahoo Finance | 0x117cc2133c37B721F49dE2A7a74833232B3B4C0C |
| QQQ | ETF | Yahoo Finance | 0xD5f3879160bc7c32ebb4dC785F8a4F505888de68 |
| GME | stock | Yahoo Finance | 0x1b0E319c6A659F002271B69dB8A7df2F911c153E |
SPCX: listed June 2026, not enough history yet. Anything outside the list returns the list and three examples.
03 · Data
Where the numbers come from
- Crypto
- Coinbase Exchange daily candles (3+ years, paginated) and the live ticker; OKX history as backup. Indicators use the last closed UTC day; the live price is a separate item.
- Stocks
- Yahoo Finance daily chart, up to 10 years, kept in a local cache so the referee keeps working if Yahoo is slow. Adjusted closes for indicators and history, the raw close for the last-close item.
- RC tokens
- Robinhood Chain token price from GeckoTerminal, shown as its own item labelled "DEX price, unofficial". It is never used by the referee.
- Refresh
- Crypto: latest bar and ticker every 60 s while people use the app, full bars daily at 01:10 UTC. Stocks: every 15 minutes during US market hours (13:30–21:00 UTC, Mon–Fri) and once at 22:30 UTC. Bars are never deleted.
- As of
- Every item carries its source and time. On weekends stock numbers read "as of Fri close". Data older than 7 days (crypto) or 5 trading days (stocks) gets a red "data as of" badge.
Live status: loading…
04 · Data pack
The same numbers, for both agents
The server builds one pack per bout from the cache. Each item has an id the agents must cite, like [d9].
| id | Item | How |
|---|---|---|
| d1 | Last close | Latest daily close and its date |
| d2 | 1-day return | close ÷ previous close − 1 |
| d3 | 7-day / 1-week return | vs 7 days ago (crypto) or 5 trading days ago (stocks), adjusted closes |
| d4 | 30-day / 1-month return | vs 30 days or 21 trading days ago |
| d5 | 90-day / 3-month return | vs 90 days or 63 trading days ago |
| d6 | MA20 | Simple average of the last 20 closes |
| d7 | MA50 | Simple average of the last 50 closes |
| d8 | MA200 | Simple average of the last 200 closes, plus price above or below it in % |
| d9 | RSI14 | Wilder's 14-day relative strength index |
| d10 | 30-day volatility, annualized | Std. dev. of the last 30 daily log returns × √365 (crypto) or √252 (stocks) |
| d11 | Distance from 52-week high | close ÷ highest close of the last 365 days (252 trading days) − 1 |
| d12 | Distance above 52-week low | close ÷ lowest close of the same window − 1 |
| d13 | Drawdown from all-time high in our data | close ÷ highest close in the stored history − 1 |
| d14 | Volume vs 30-day average | Last volume ÷ average of the previous 30 days |
| d15 | RC token price | Stocks only: GeckoTerminal DEX price on Robinhood Chain, unofficial |
| d16 | Live price | Crypto only: Coinbase ticker with its time |
05 · Agents
TORO and OSO
TORO argues for the asset, OSO argues against it, whatever side your trade takes; your side and horizon are passed as context. Who opens is random. Four turns: two openings (up to 90 words, at least two cited numbers) and two rebuttals (up to 60 words, at least one cited number, and each must answer a number the other side used).
- Model
- anthropic/claude-haiku-5.5 via OpenRouter; anthropic/claude-sonnet-5.5 as a backup for a turn that fails twice.
- Cite rule
- Agents may only use numbers from the pack, written exactly as the pack writes them, each tagged with its id.
- Number check
- Every number in a turn is matched to one pack item (exact text, or within 0.5% or half the last written digit). A tagged number must match that very item. Percent figures only match percent items.
- Banned
- Price targets, forward-looking promises, buy or sell calls, outside sources, emoji. A turn that uses them fails the check.
- What gets cut
- A failing turn is rewritten once with the error, then tried once on the backup model. If it still fails, sentences with bad numbers or banned words are removed. If nothing is left, the turn is replaced by plain data lines from the pack and marked "agent fell back to data lines".
- Offline
- If the agents are down, bouts still run with data lines and the referee; the feed marks them "verdict only".
06 · Referee
How similar days played out before
The referee is plain code on the server, no language model. For every past day with at least 200 earlier bars it computes three features:
- Trend: close above MA50 = up, else down.
- RSI14 bucket: below 30 · 30–50 · 50–70 · above 70.
- 30-bar return bucket: crypto below −20% · −20 to 0 · 0 to 20 · above 20%; stocks and ETFs below −10% · −10 to 0 · 0 to 10 · above 10%.
Today's features come from the last closed bar. Similar days are past days of the same asset with all three buckets equal and a full horizon after them. The forward return is close[t+H] ÷ close[t] − 1, with H = 1 / 7 / 30 bars for crypto and 1 / 5 / 21 trading days for stocks (shown as 1 day / 1 week / 1 month).
- Widening
- Under 20 similar days: drop the 30-day return bucket ("widened: ignoring 30-day return"); still under 20: trend only ("widened: trend only"); still under 20: "Not enough history for this setup", no verdict.
- Verdict
- 58% or more closed higher: "History sides with TORO". 42% or less: "History sides with OSO". In between: "Too close to call". The verdict is about the asset, not about you.
- Shown
- n similar days, % that closed higher, median, best, worst, the base rate (all days, same horizon) and the date range searched.
- Caveat
- Windows overlap, so n overstates independent cases. How similar days played out before. Not a prediction.
Anyone can check it without the agents: POST /api/verdict.
07 · Limits
Fair use
- Bouts
- 10 free bouts per day per IP address, reset at 00:00 UTC. One bout at a time per IP address, 8 at a time overall.
- Rate
- 6 requests per minute per IP address.
- Budget
- A daily cap on what the agents cost. When it is spent, agents rest until 00:00 UTC.
- Verdict only
- Always on: the referee without agents, with its own allowance of 60 a day. Used automatically when the agents are out.
08 · API
Try it with curl, no key
curl -s -X POST https://toroso.trade/api/debate -H 'content-type: application/json' -d '{"q":"long NVDA 1w","stream":false}'
| Endpoint | What |
|---|---|
POST /api/debate | {q, stream?}. Server-sent events by default: meta, pack, turn ×4, verdict, done, or error. stream:false returns the saved bout as JSON. |
POST /api/verdict | {q}. The referee only, no agents. |
GET /api/debate/<id> | A saved bout. |
GET /api/recent?limit=10 | Latest bouts. |
GET /api/assets | The 15 assets with last close and source. |
GET /api/health | Agents on or off, budget, data as-of per asset class. |
GET /d/<id>.png | The 1200×630 card. |
09 · Trade it
Act on it in your own wallet, if you want
Toroso discusses trades. If you want to act, you sign the swap in your own wallet; it goes straight to Uniswap on Robinhood Chain. Toroso never holds funds and takes no fee.
- Where
- Only for the 9 tokenized stocks on Robinhood Chain (chain id 4663). Crypto bouts have no trade button.
- How
- "Trade it" opens a swap panel: connect an injected wallet, switch to Robinhood Chain, see the quote and the minimum you receive (slippage 0.1%, 0.5% or 1%), sign. Quotes expire after 30 seconds and are refreshed before sending.
- Short
- A short trade shows "Sell what you hold": it sells tokens you already own. There is no shorting.
- Approvals
- Only to the Uniswap SwapRouter02
0xCaf681a66D020601342297493863E78C959E5cb2, and only for the exact amount of that swap. No approval to any Toroso contract; Toroso has none. - When not
- No button when the pool is too thin (under $50k liquidity) or the price impact is over 2%.
- Check it
- Every swap links to Blockscout. DEX prices are unofficial and keep moving when the stock market is closed.
10 · Token
The token
The contract address appears here, on the first screen and on @torosotrade at launch. Until then the address shown is all zeros: anything else claiming to be TOROSO is not us.
Holding the token pays nothing.
Holding ≥ 1,000,000 tokens raises your limit from 10 to 50 bouts a day. Enforced by our server, not by a contract. Holding pays nothing else.
11 · Risks
What can go wrong
- Read as advice. It is a debate and a count of past days. The verdict is about the asset, never about you. Not financial advice.
- Agents make up numbers. The number check, rewrites, cuts and data-line fallback exist for this, and fallbacks are visible.
- Small, overlapping samples. n, the date range and the base rate are always shown; under 20 days there is no verdict.
- Data late or wrong. Yahoo Finance is unofficial and can change or rate-limit; Coinbase can limit. Cache, backups and the stale badge help, they do not fix it.
- Weekends and holidays. Stock numbers are as of the last close; horizons count trading days.
- Swaps. Prices move, pools can be thin, a token issuer can pause transfers, a transaction can fail. You sign every step yourself.
- Costs. A daily budget caps agent spend; when it is out, agents rest and the referee keeps working.
- Clones. Copies are easy to make. The real address is only posted on toroso.trade and @torosotrade.
12 · Disclaimer
TOROSO is a small web app and a token, run by a small team. Two language-model agents argue a trade using the same set of numbers; every number they say is checked against that set, and the verdict comes from how similar days played out in the past, not from the agents. Past days are not a prediction, the sample is small and overlapping, and the data (Coinbase, Yahoo Finance, GeckoTerminal) can be late or wrong. Toroso never holds funds and takes no fee. Swaps are signed in your own wallet and executed by Uniswap on Robinhood Chain. Holding the token pays nothing.Holding the token pays nothing else. Holding ≥ 1,000,000 tokens only raises your daily limit, enforced by our server. Not financial advice.