Skip to main content
Most trading on Murmo is social. Three nouns — groups, proposals, and positions — explain almost the entire API surface. Once you understand how they relate, navigating the reference becomes straightforward.

Groups

A group is a trading circle. You belong to zero or more groups, each identified by a uniqueId. Groups come in two visibility modes:
  • PUBLIC — anyone can join instantly.
  • PRIVATE — membership requires a request or invite from an existing member.
Every member of a group has a memberType of MEMBER, LEADER, or ADMIN (the group creator). Leaders are the accounts whose trade ideas — proposals — other members follow. GET /api/v1/groups lists only the groups you belong to. There is deliberately no discovery endpoint for other users’ groups. Private group internals stay private, and every per-group read is gated to members — requests from non-members return 403 NOT_GROUP_MEMBER.

Proposals

A proposal is a trade idea posted inside a group. Every proposal belongs to exactly one of three verticals:

Spot

A Solana token trade. The leader buys in; members can follow, add, sell out, and the creator can close the proposal when done.

Prediction

A YES/NO position on a Kalshi event. Members predict, sell their shares, and claim winnings after resolution.

Perp

A leveraged LONG/SHORT idea on Phoenix RISE. Members join (increase), reduce, or close their side of the position.
Creating a proposal always includes the creator’s opening trade in a single call. Other members then take their own positions under the same proposal — each member manages their own entry and exit independently, but the underlying idea is shared. The fields participantCount and participantAvatars show how many people are in.
Group (uniqueId)
 ├── Spot proposal (BONK)          ──▶ your position + other members'
 ├── Prediction proposal (KC win)  ──▶ your YES position + other members'
 └── Perp proposal (BTC LONG 5×)  ──▶ your position + other members'

Positions

A position is your personal stake in a proposal. You open, manage, and close positions independently from other members — the proposal is the shared context, but the position is yours alone. Each vertical has its own position lifecycle:
VerticalLifecycle actions
SpotOpen → Buy more → Sell (partial or full) → Close
PredictionPropose / Predict → Sell → Claim winnings
PerpOpen → Increase → Reduce → Close → Claim funding
Your positions across every group and vertical are aggregated on the portfolio endpoints:
  • GET /api/v1/positions — all open positions (perps + spot + predictions)
  • GET /api/v1/positions/past — closed and resolved positions
  • GET /api/v1/trades — executed trade history (spot + predictions)

Copy-trading (auto-buy)

The core reason groups exist is to let you follow good traders automatically. When you enable auto-buy for a group, every new proposal from that group is mirrored into your wallet at a fixed size you control — no manual action required.
curl -X POST "$MURMO_BASE/api/v1/groups/GROUP_ID/auto-buy" \
  -H "Authorization: Bearer $MURMO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "enabled": true, "amountUsd": "25.00" }'
Set amountUsd to a comfortable fixed-dollar size. Auto-buy fires for every new proposal in the group, so size it for a trade you’d be comfortable with on any given idea from that leader.

Response envelopes

Every response is wrapped in a data envelope. The shape inside data varies by endpoint, and it is worth checking before you write .map() or destructure a key.
Patterndata containsExample endpoints
Homogeneous listAn arrayGET /spot/proposals, GET /predictions/proposals, GET /perps/proposals, GET /perps/positions, GET /groups
Cross-vertical aggregateAn object keyed by verticalGET /positions, GET /positions/past, GET /trades, GET /groups/{id}/proposals
Named single listAn object with a named keyGET /account/balances{ balances: [...] } · GET /account/positions{ positions: [...], nextCursor }
Single resourceAn object (or null)Detail and mutation endpoints
The aggregate endpoints — /positions, /positions/past, /trades, and /groups/{id}/proposals — return an object keyed by vertical, not a flat array. Calling .map() directly on data will throw. Always check the API Reference for the exact shape of an endpoint’s data before iterating.