Copy a trade
MCP tool: place_order
This is a one-off manual copy and is independent of autopilot. It works while autopilot is paused: the flag that governs it is readiness.canManualTrade, not readiness.liveCopy, and a coming_soon entry in the autopilot log says nothing about whether this will succeed.
dryRun defaults to true and returns the quote without spending: the fill price, the fee, the book depth, and driftCents, which is how far the market has moved since the trader took the position.
A live order requires the trade scope and an Idempotency-Key header. Reuse the same key value when retrying; a retry with the same key returns the original result instead of buying twice. Reusing a key with different order details is refused rather than treated as a new order.
Orders are also bounded by the key's daily spend cap, which is reserved before submission and released if the order never reaches the venue.
Body parameters
eventIdstringrequiredThe trade to copy, from the events endpoint or the live feed.
usdAmountnumberrequiredUSD to stake. Max 5000.
slippageBpsnumber0 to 2000.
dryRunbooleandefault: trueMust be explicitly false to place a real order.
Response
A live call returns placed true with an orderId, and sets the Idempotency-Replayed header to true when the response came from a previous identical call.
needsDriftConfirm true means the price has moved enough that the copy is materially different from the trade being copied. Pass confirmedDrift to proceed anyway.
curl -X POST https://api.rivo.markets/v1/orders \
-H "Authorization: Bearer rivo_live_..." \
-H "Content-Type: application/json" \
-d '{
"eventId": "b4a4f7a0-4a5e-4e9d-9c1e-2f6d8f3a1c77",
"usdAmount": 50,
"dryRun": true
}'import requests
r = requests.post(
"https://api.rivo.markets/v1/orders",
headers={"Authorization": "Bearer rivo_live_..."},
json={
"eventId": "b4a4f7a0-4a5e-4e9d-9c1e-2f6d8f3a1c77",
"usdAmount": 50,
"dryRun": True,
},
)
print(r.json()["data"])const res = await fetch("https://api.rivo.markets/v1/orders", {
method: "POST",
headers: {
Authorization: "Bearer rivo_live_...",
"Content-Type": "application/json",
},
body: JSON.stringify({
eventId: "b4a4f7a0-4a5e-4e9d-9c1e-2f6d8f3a1c77",
usdAmount: 50,
dryRun: true,
}),
});
const { data } = await res.json();{
"success": true,
"data": {
"dryRun": true,
"placed": false,
"usdAmount": 50,
"quote": {
"tokenId": "7194...2f10",
"outcomeName": "YES",
"bestAsk": 0.71,
"marketPrice": 0.7171,
"whaleEntryPrice": 0.62,
"driftCents": 9,
"needsDriftConfirm": true,
"feeBps": 100,
"bookDepthShares": 4120
}
}
}