Groups
A group is a trading circle. You belong to zero or more groups, each identified by auniqueId. Groups come in two visibility modes:
- PUBLIC — anyone can join instantly.
- PRIVATE — membership requires a request or invite from an existing member.
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.
participantCount and participantAvatars show how many people are in.
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:| Vertical | Lifecycle actions |
|---|---|
| Spot | Open → Buy more → Sell (partial or full) → Close |
| Prediction | Propose / Predict → Sell → Claim winnings |
| Perp | Open → Increase → Reduce → Close → Claim funding |
GET /api/v1/positions— all open positions (perps + spot + predictions)GET /api/v1/positions/past— closed and resolved positionsGET /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.Response envelopes
Every response is wrapped in adata envelope. The shape inside data varies by endpoint, and it is worth checking before you write .map() or destructure a key.
| Pattern | data contains | Example endpoints |
|---|---|---|
| Homogeneous list | An array | GET /spot/proposals, GET /predictions/proposals, GET /perps/proposals, GET /perps/positions, GET /groups |
| Cross-vertical aggregate | An object keyed by vertical | GET /positions, GET /positions/past, GET /trades, GET /groups/{id}/proposals |
| Named single list | An object with a named key | GET /account/balances → { balances: [...] } · GET /account/positions → { positions: [...], nextCursor } |
| Single resource | An object (or null) | Detail and mutation endpoints |