Configure autopilot
MCP tool: set_autopilot
With paper true, which is the default, this simulates fills and spends nothing. With paper false it places real orders with your money.
Going live takes two independent affirmations, config.paper false and confirmLive true, plus a key holding the trade scope. A client that sets one without meaning to still cannot spend.
Live autopilot is venue-shaped. It is open on Kalshi today, where it executes through your own connected Kalshi key, and is still coming soon on Polymarket: paper false on a Polymarket trader is refused with LIVE_TRADING_UNAVAILABLE.
Check the portfolio endpoint with include=readiness first and read readiness.liveCopy for the venue you are about to use. If allowed is false, this call will be refused and blockers says why.
Turning autopilot off or pausing it needs only the write scope and never needs confirmation.
Body parameters
statusstringrequired"off", "active" or "paused_user".
configobjectRequired when status is active.
modestringrequired"fixed" or "proportional".
stakeUsdnumberPer copy. Required for fixed mode. Max 5000.
proportionPctnumberPercent of the trader's own size. Required for proportional mode.
maxPerTradeUsdnumberrequiredHard ceiling per copy. Max 5000.
dailyCapUsdnumberrequiredCeiling per day for this follow. Max 20000.
paperbooleandefault: trueSimulate rather than spend.
mirrorExitsbooleandefault: falseSell when the trader fully closes.
confirmLivebooleanRequired alongside config.paper false. Acknowledges that real money will be spent.
Response
Refusals are coded: SCOPE_REQUIRED when the key cannot trade, VALIDATION when confirmLive is missing, LIVE_TRADING_UNAVAILABLE when real-money autopilot is not open on that venue, NOT_FOUND when you do not follow that trader.
curl -X PATCH https://api.rivo.markets/v1/traders/polymarket/0x9f2c8e1b7a4d6035c8e1b7a4d60359f2c8e1b7a4/autopilot \
-H "Authorization: Bearer rivo_live_..." \
-H "Content-Type: application/json" \
-d '{
"status": "active",
"config": {
"mode": "fixed",
"stakeUsd": 50,
"maxPerTradeUsd": 100,
"dailyCapUsd": 500,
"paper": true
}
}'import requests
r = requests.patch(
"https://api.rivo.markets/v1/traders/polymarket/0x9f2c8e1b7a4d6035c8e1b7a4d60359f2c8e1b7a4/autopilot",
headers={"Authorization": "Bearer rivo_live_..."},
json={
"status": "active",
"config": {
"mode": "fixed",
"stakeUsd": 50,
"maxPerTradeUsd": 100,
"dailyCapUsd": 500,
"paper": True,
},
},
)
print(r.json()["data"])const res = await fetch("https://api.rivo.markets/v1/traders/polymarket/0x9f2c8e1b7a4d6035c8e1b7a4d60359f2c8e1b7a4/autopilot", {
method: "PATCH",
headers: {
Authorization: "Bearer rivo_live_...",
"Content-Type": "application/json",
},
body: JSON.stringify({
status: "active",
config: {
mode: "fixed",
stakeUsd: 50,
maxPerTradeUsd: 100,
dailyCapUsd: 500,
paper: true,
},
}),
});
const { data } = await res.json();{
"success": true,
"data": { "status": "active", "paper": true }
}