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"); the
auto-buy amountUsd is a decimal string ("25.00"). Never send a number or raw base units. See
Money & precision.Auto-buy: follow a group automatically
POST /api/v1/groups/{id}/auto-buy sets your copy-trade follow for one group. With { "enabled": true, "amountUsd": "25.00" }, every new call from that group is mirrored into your wallet at a fixed $25 size. Send { "enabled": false } to turn it off.
Response
enabled (a boolean) is required. Omit it, or send anything other than true/false, and you
get a 400. amountUsd is the fixed follow size and is only meaningful when enabled is true.Follow a group in 3 steps
Find a group you're in
GET /api/v1/groups returns the groups you belong to. Grab a uniqueId to follow. There is no
endpoint to discover other people’s groups — join via an invite or a public group ID first (see
Membership below).Turn on auto-buy
Call
POST /api/v1/groups/{id}/auto-buy with { "enabled": true, "amountUsd": "25.00" }. The
response echoes your membership record with autoBuyEnabled: true.The group trades for you
From now on, every new call the group’s leaders post is mirrored into your wallet at $25. To see
what’s being called, read the group’s proposals (
GET /api/v1/groups/{id}/proposals) or your
aggregated positions. Change the size by calling auto-buy again
with a new amountUsd; stop with { "enabled": false }.Membership
List your groups
GET /api/v1/groups returns only your groups — the ones you’re a member of. There is deliberately no endpoint to discover other people’s groups; private group internals stay private.
data is an array of Group objects enriched with per-user data (your performanceRank, unread counts, etc.). Key fields:
| Field | Type | Notes |
|---|---|---|
uniqueId | string | The group ID you pass as {id} everywhere. |
name, description, image, header | string / null | Display fields. |
joiningFee, subscriptionFee | decimal string | Whole-dollar fees, e.g. "0", "10". |
groupAccessType | enum | PUBLIC or PRIVATE. |
defaultMemberType | enum | LEADER or MEMBER — the role new joiners get. |
isActive | boolean | Whether the group is active. |
performancePnl | object / null | { allTimePnl, pnl7Days, pnl30Days }, each a decimal string. |
winRate, avgReturn, volatility | decimal string / null | Percentages as decimal strings (e.g. "42.7" = 42.7%). |
tradeCount, memberCount, performanceRank | integer / null | Structural counts. |
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
statusisJOINED, with your fullmembership. - PRIVATE group → a join request is created for leaders to approve. Response
statusisREQUESTED. Once approved, call join again with{ "finalize": true }to finalize (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).
Joined response
Requested response (private group)
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).
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 what auto-buy is mirroring or to act on a call 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.
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
| Body field | Required | Type | Notes |
|---|---|---|---|
name | yes | string | Group display name. |
joiningFee | yes | decimal string | Whole-dollar one-time join fee, e.g. "0". |
groupAccessType | yes | enum | PUBLIC or PRIVATE. |
subscriptionFee | no | decimal string | Whole-dollar recurring fee. |
defaultMemberType | no | enum | LEADER or MEMBER for new joiners (default MEMBER). |
description, header, image | no | string | Display fields. |
joiningFee is required and must be a whole-dollar string — use "0" for a free group. A
missing or malformed joiningFee, name, or groupAccessType returns 400.Update group settings
PATCH /api/v1/groups/{id} — leaders and admins only. Send only the fields you want to change.
isActive (boolean). Returns the updated Group.
Approve or reject join requests
GET /api/v1/groups/{id}/join-requests lists pending REQUESTED members (leaders and admins only).
Response
POST /api/v1/groups/{id}/join-requests/{userId}/approve. The default action approves; send { "action": "reject" } to reject.
Approved response
After approval, the requester finalizes their own membership — either it auto-joins
(
autoJoined: true) 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.promote returns the updated GroupMember (now with memberType: "LEADER"). kick returns { "data": { "success": true } }.
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)
POST /api/v1/groups/{id}/agents (admin only). agentKey is required; action defaults to enable.
Enable response
Enabling an agent for the first time spends activation points from the admin’s balance
(
paymentRequired: true, with a pointsTransaction). Insufficient points returns 400.Field reference
GroupMember (auto-buy, promote, subscription responses)
| Field | Type | Notes |
|---|---|---|
userDynamicId | string | The member’s user ID. |
groupId | string | The group. |
memberType | enum | LEADER or MEMBER. |
username, avatar | string / null | Display fields. |
subscriptionStatus | string / null | Subscription state. |
nextChargeAt | date-time / null | Next subscription charge. |
inviteCode | string / null | The member’s invite code, if any. |
autoBuyEnabled | boolean | Whether copy-trade follow is on. |
autoBuyAmountUsd | decimal string / null | The fixed follow size in USD. |
createdAt, updatedAt | date-time | ISO timestamps. |
Membership (create / join responses)
Same as GroupMember but without username/avatar, plus mainWalletAddress (string / null) and an optional nested group object. 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.