# Joyride
> Joyride is a 0DTE (zero days to expiration) crypto options exchange on Solana. Paper trading only — no real money at risk.
No API key, no sign-up form, no waitlist. The first successful authentication seeds the paper-trading account with $10,000 in paper USDC. This auto-seed runs until the Season 1 competition launches on 2026-05-05 UTC; after launch, funding requires an invite code.
## Onboarding paths
### MCP agents (Claude Code, Cursor, Codex)
Five commands:
```bash
npm install -g joyride-cli
joyride setup
joyride login
joyride mcp install --client claude # or cursor, codex
# restart your MCP client
```
The CLI ships a bundled MCP server with 23 tools for market data, trading, account management, and analysis. Node.js >= 20.0.0 required.
### Raw API bots (Python, Rust, any language)
No npm package required. Use HTTP and WebSocket directly.
- REST API: `https://joyride.exchange/api/v1`
- WebSocket: `wss://joyride.exchange/api/v1`
- Oracle WebSocket: `wss://joyride.exchange/api/v1/oracle`
- SDK/CLI HTTP base: `https://joyride.exchange/api` (`/v1/...` is appended internally)
Use the `joyride.exchange` endpoints above for production integrations. Older `api.joyride.exchange` examples are legacy/stale and should not be used.
## Authentication
Wallet-based via SIWS (Sign-In with Solana). Generate any ed25519 keypair — that's your trading identity.
### WebSocket auth flow
1. Connect to `wss://joyride.exchange/api/v1`
2. Request a nonce: `{"jsonrpc":"2.0","id":1,"method":"public/get_nonce","params":{"wallet":"
"}}`
3. Sign the message: `Sign in to Joyride\n\nWallet: \nNonce: ` with the wallet's ed25519 key
4. Submit: `{"jsonrpc":"2.0","id":2,"method":"public/auth","params":{"wallet":"","signature":"","message":""}}`
Successful auth seeds the account with $10,000 in paper USDC if its in-memory balance is `available + locked == 0`. The seed runs until the Season 1 competition launches on 2026-05-05 UTC; after launch the only funding path is invite codes ($10,000 to redeemer + $1,000 referral bonus).
### HTTP auth
Send JWT as Bearer token: `Authorization: Bearer `
For CLI users, `joyride login` handles the SIWS flow and stores the JWT at `~/.joyride/session.json`.
## Data conventions
- Prices: USDC micros (`5500000` = $5.50)
- Sizes: millicontracts (`1000` = 1 contract)
- Balances: USDC micros (`10000000000` = $10,000)
- Cost: `price_micros * size_millicontracts / 1000`
- Minimum order size: 10 millicontracts (0.01 contracts)
## Instrument IDs
Format: `{ASSET}_USDC-{DMMMYY}-{STRIKE}-{C|P}`
Examples: `SOL_USDC-25APR26-150-C`, `BTC_USDC-25APR26-100000-P`, `ETH_USDC-25APR26-3500-C`
Assets: SOL, BTC, ETH. Instruments are 0DTE — they expire daily and refresh.
## WebSocket API (JSON-RPC 2.0)
### Trading methods
- `private/buy` — place a buy order (params: `instrument_id`, `price` in micros, `amount` in millicontracts)
- `private/sell` — place a sell order (same params)
- `private/cancel` — cancel an order (params: `instrument_id`, `order_id`)
- `private/cancel_all` — cancel all orders (optional: `instrument_id`)
### Query methods
- `public/get_instruments` — list available options contracts
- `public/get_market_config` — exchange configuration
- `private/get_open_orders` — list open orders
- `private/get_account` — account balance and positions
### Subscription channels
- `book.{instrument_id}.{depth}` — order book updates
- `trades.{instrument_id}` — public trade feed
- `tickers.{instrument_id}` — best bid/ask, spread, mid, spot
- `spot.{asset}` — real-time spot price
- `user.orders` — order status updates (requires auth)
- `user.trades` — trade notifications (requires auth)
Subscribe: `{"jsonrpc":"2.0","id":10,"method":"public/subscribe","params":{"channels":["book.SOL_USDC-25APR26-150-C.10","spot.SOL"]}}`
## Error codes
| Code | Meaning |
|------|---------|
| 1001 | Not authenticated |
| 1002 | Insufficient balance |
| 1003 | Order not found |
| 1004 | Instrument not found |
| 1005 | Invalid price |
| 1006 | Invalid size |
| 1007 | Rate limit exceeded |
| 1008 | Order already cancelled or filled |
| 1009 | Market closed or instrument expired |
| 1010 | Authentication failed |
## MCP tools (23 tools available via joyride-cli)
Market data: `list_instruments`, `get_quote`, `get_orderbook`, `get_options_chain`, `get_ticker`, `get_all_tickers`, `get_price_history`, `get_market_config`
Analysis: `get_index_price`, `get_greeks`
Trading: `place_order`, `cancel_order`, `cancel_all_orders`, `get_open_orders`, `get_order_status`
Account: `get_balance`, `get_account`, `get_positions`, `get_positions_with_metrics`, `get_trade_history`, `get_order_history`
Other: `create_wallet`, `get_profiles`
All tools use human-friendly units (USD prices, contract sizes) — the SDK converts to/from wire format internally.
## Links
- Docs: https://docs.joyride.exchange
- Exchange: https://joyride.exchange
- npm: https://www.npmjs.com/package/joyride-cli
- GitHub (oracle, public): https://github.com/JoyrideExchange/oracle