1. Install the CLI
Node.js 20 or later is required.npm install -g joyride-cli@latest.
2. Create an account
Accounts are created in the web app at joyride.exchange with a wallet and a referral code. A wallet with no Joyride account is rejected at sign-in with an error naming the sign-up step. There is no API-key signup and no self-serve provisioning from the CLI.3. Sign in
~/.joyride. Sign-in is Sign-In with Solana: the wallet signs a server nonce
and receives a session token, which is stored and resumed by later commands.
An account may hold three concurrent authenticated sessions; a fourth evicts
the oldest.
4. Provision the vault subaccount
Do this before the first request. A first-time account has no margin-vault subaccount, and RFQ reads and requests fail readiness checks until one exists.exists,
submitted, refused, or asked_recently and exits 0 for all four: each is a
closed answer to the question that was asked. A timeout is the one non-zero
exit, and it means the outcome is genuinely unknown rather than refused.
5. Wait for readiness
Provisioning lands on chain and then in the read projection, which lags. Poll until the account reportsready:
unknown is not zero. A funded account whose balance column has not landed yet
reports unknown, and treating that as an empty account is the single most
common first-run mistake.
Deposits are made in the web app. The CLI never moves money.
6. Connect an AI client
The MCP server ships inside the same package. Register it with a client:--client accepts claude, codex, or cursor. The server resumes the
session token joyride login stored, so sign in before starting the client.
The MCP server can request quotes and read RFQ state. It cannot sign, so it
cannot accept a quote; that happens here in the CLI or in the app. See
MCP Server for what the tools expose and for the spend
ceiling an operator must configure.
7. Request a quote
A package is one to thirteen legs on a single underlying and a single expiry. Quantities are signed: positive means you receive the leg when you buy the package, negative means you deliver it. Instruments are 0DTE and refresh daily, so pick live symbols first:quoted prints the two-way price and exits 0. unquoted means
nobody priced the package: nothing happened, nothing is owed, and requesting
again costs nothing. unresolved exits 3 and means the outcome is unknown, not
that there was no quote; read the request back with joyride rfq show before
sending another.
8. Accept one side
--yes to consent
without the prompt. Without a terminal and without --yes the command refuses
and signs nothing.
--max-premium and --max-locked are yours, and they are evaluated by the SDK
against the same read the signature is built from rather than pre-checked
locally. --max-premium bounds the total cash cost: the
premium plus the trading fee maximum the signature authorizes. Set it above
both, and note that a package whose premium comes towards you still owes the
fee, so it is not automatically under the ceiling. CLI has
the operator variables that do the same job unattended.
A quote is firm until its expires_at and the accepting side is the whole
package: every leg fills in one on-chain transaction or none does.
Where to go next
- CLI for the full
rfqcommand group, the leg grammar, output modes, and the operator ceilings - MCP Server for driving Joyride from an AI client
- TypeScript Maker SDK if you intend to quote rather than take
- Fees and Limits for the live fee schedule