Skip to main content
A group is a trading circle: members open and follow proposals inside it. This guide covers the group endpoints: list your groups, join and leave, run a group you create, manage members and agents, and read a group’s open proposals. For the model behind groups and proposals, read Groups & proposals first.
Every monetary value on the wire is a full-precision decimal string in USD. Group fees (joiningFee, subscriptionFee) are whole-dollar amounts sent as strings ("0", "10"). Never send a number or raw base units. See Money & precision.

Membership

List your groups

GET /api/v1/groups returns only your groups — the ones you’re a member of, like /positions and /trades. There is deliberately no endpoint to discover other people’s groups; private group internals stay private.
data is an array of Group objects, enriched per-user (your performanceRank, unread counts, etc.). The money/percent fields are decimal strings:

Join a group

POST /api/v1/groups/{id}/join. How it resolves depends on the group type and the body:
  • PUBLIC group → you join immediately. Response status is JOINED, with your full membership.
  • PRIVATE group → a join request is created for the leaders to approve. Response status is REQUESTED. Once a leader approves you, call join again with { "finalize": true } to finalize the membership (status: JOINED).
  • { "inviteCode": "..." } → routes by the code and ignores the group type: a public invite joins you immediately (JOINED), a private invite creates a request (REQUESTED). The {id} in the path is not used to look up the group when an invite code is present.
Response — joined
Response — requested (private)
The status field tells you what happened — branch on JOINED vs REQUESTED. Don’t assume a join succeeded just because you got a 200: a REQUESTED response means you’re still waiting on a leader. A non-existent group id (without an invite code) returns 404.
If the group charges a joiningFee or subscriptionFee, joining settles that fee against your cash balance. Fees are whole-dollar strings; check them on the Group object before you join.

Leave a group

POST /api/v1/groups/{id}/leave queues a background job that sells your positions in the group and then removes your membership. It returns immediately with status: "EXITING" — the exit is not instantaneous.
Response

Pay your subscription

If your membership is past due, POST /api/v1/groups/{id}/subscription charges the subscription fee against your cash balance and returns your refreshed member record (with subscriptionStatus and nextChargeAt).
The response data is a GroupMember object.

The group’s proposals

GET /api/v1/groups/{id}/proposals returns every open call in the group — spot/perp and prediction — as one combined object. Use it to see the group’s open calls, or to act on one yourself.
Response (shape)
data is an object keyed by vertical, not an array. Each entry carries the proposal plus your own position in it. To open or manage positions, see the per-vertical guides: Spot trading, Prediction markets, and Perpetuals.
Every per-group read (proposals, agents, join-requests) is gated to members. If you’re not in the group you get 403 with code: NOT_GROUP_MEMBER. See Errors.

Run your own group

Create a group

POST /api/v1/groups. The caller becomes the group ADMIN. name, joiningFee, and groupAccessType are required; fees are whole-dollar strings.
Response
joiningFee is required and must be a whole-dollar string (use "0" for a free group). name and a valid groupAccessType are required too; missing or malformed values return 400.

Update group settings

PATCH /api/v1/groups/{id}leaders and admins only. Send only the fields you want to change.
Accepts the same fields as create, plus isActive (boolean). Returns the updated Group. The body fields are: name, description, header, image, joiningFee, subscriptionFee, groupAccessType, defaultMemberType, isActive — all optional.

Approve or reject join requests

GET /api/v1/groups/{id}/join-requests lists the pending REQUESTED members (leaders/admins only).
Response
Resolve one with POST /api/v1/groups/{id}/join-requests/{userId}/approve. The default action approves; send { "action": "reject" } to reject.
Response — approved
Response — rejected
After approval, the requester still finalizes their own membership — either it auto-joins (autoJoined: true in the response) or they call join with { "finalize": true }.

Kick and promote members

Both are admin-only and take the target member’s id in the path.
Kick response
promote returns the updated GroupMember (now with memberType: "LEADER").

Group agents

Agents are bots a group admin can switch on inside a group. GET /api/v1/groups/{id}/agents lists the agents configured for the group (members only).
Response (shape)
Enable or disable one with POST /api/v1/groups/{id}/agents (admin only). agentKey is required; action defaults to enable.
Response — enable
Enabling an agent for the first time spends activation points from the admin’s balance (paymentRequired: true, with a pointsTransaction). Insufficient points returns a 400. Disabling returns { "data": { "groupAgent": { ... } } }.
Leader / admin gating. Member-management and settings actions are restricted: create makes you ADMIN; PATCH, approve/reject, and join-request reads require a leader or admin; kick, promote, and agent enable/disable require an admin. Calling one without the role returns 403. See Errors.

Field reference

GroupMember (promote, subscription, and member responses)

Membership (create / join responses)

Same as GroupMember but without username/avatar, plus mainWalletAddress (string / null) and an optional nested group (Group object or null). On create, memberType is ADMIN.

Where to next

Groups & proposals

The social model: groups, proposals, positions.

Spot trading

Open, buy, sell, and close spot calls.

Prediction markets

Predict YES/NO on real-world events.

Perpetuals

Leverage, brackets, and live PnL.

Errors

Status codes and the codes worth handling.

API Reference

Every Groups endpoint, request, and response.