Portfolio and readiness
MCP tool: get_portfolio
Call this with include=readiness before configuring autopilot or placing an order. Each refuses for several unrelated reasons and readiness names the one that applies, so a client can fix it instead of retrying a call that cannot succeed.
Read the right flag. canManualTrade governs placing and selling orders yourself. Live autopilot is venue-shaped and lives in readiness.liveCopy: liveCopy.kalshi is open today, liveCopy.polymarket is still coming soon. canLiveCopy is a convenience roll-up meaning at least one venue is open, so branch on liveCopy for the venue you are about to use. canPaperCopy governs simulated autopilot and needs nothing but the write scope.
Kalshi live autopilot executes through your own connected Kalshi key, so it needs kalshi_not_connected cleared and does not need a funded trading wallet. Polymarket autopilot is the one that depends on the wallet, the delegation and the USDC balance.
blockers lists every unmet condition, for display. manualTradeBlockers is the subset that actually stops an order: key_missing_trade_scope, wallet_not_ready, delegation_expired, no_usdc_balance, spend_cap_reached. Branch on that one, not on blockers.
The autopilot-only entries are autopilot_disabled, coming_soon, kalshi_kill_switch and kalshi_not_connected. None of them prevents a manual order. Within liveCopy each one is scoped to the venue it actually stops, so kalshi_not_connected blocks a Kalshi copy and says nothing about Polymarket.
Query parameters
includestringdefault: positions,orders,exits,readinessComma-separated: "positions", "orders", "exits", "readiness".
paperbooleandefault: falseReturn the simulated portfolio built from paper fills instead of real positions.
Response
A section not named in include comes back null rather than absent, so a client can tell a section it did not ask for from one that is empty.
tokenId and conditionId appear on positions only for a key holding the trade scope, since selling is impossible without them.
curl "https://api.rivo.markets/v1/portfolio?include=positions%2Creadiness" \
-H "Authorization: Bearer rivo_live_..."import requests
r = requests.get(
"https://api.rivo.markets/v1/portfolio",
headers={"Authorization": "Bearer rivo_live_..."},
params={
"include": "positions,readiness",
},
)
print(r.json()["data"])const res = await fetch("https://api.rivo.markets/v1/portfolio?include=positions%2Creadiness", {
headers: { Authorization: "Bearer rivo_live_..." },
});
const { data } = await res.json();{
"success": true,
"data": {
"paper": false,
"positions": [
{
"positionKey": "7194...2f10",
"platform": "polymarket",
"title": "Will the Fed cut in September?",
"outcome": "YES",
"shares": 320.5,
"avgPrice": 0.62,
"curPrice": 0.71,
"currentValue": 227.55,
"cashPnl": 28.84,
"percentPnl": 14.51,
"redeemable": false
}
],
"orders": null,
"exits": null,
"readiness": {
"canPaperCopy": true,
"canManualTrade": true,
"canLiveCopy": true,
"liveCopy": {
"kalshi": { "allowed": true, "blockers": [] },
"polymarket": { "allowed": false, "blockers": ["coming_soon"] }
},
"blockers": ["coming_soon"],
"manualTradeBlockers": [],
"wallet": {
"status": "ready",
"usdcBalance": 412.88,
"delegationStatus": "active",
"delegationExpiresAt": 1763020800000
},
"kalshiConnected": false,
"key": { "scopes": ["read", "write"], "dailySpendCapUsd": null, "spentTodayUsd": 0 }
}
}
}