Read
List and read bets
Paginated. Regular users always see only their own bets — the account scope is enforced server-side.
Filters use the field_eq=value grammar. A bare ?state=… does not filter. evmAddress_eq must be lower-cased.
JWT access token from POST /auth/authenticate
Filter by bet state
Filter by wallet address (must be lower-cased)
Filter by asset name
Filter by bet side
Created at lower bound (epoch ms)
Created at upper bound (epoch ms)
Activated at lower bound (epoch ms)
Activated at upper bound (epoch ms)
Resolved at lower bound (epoch ms)
Resolved at upper bound (epoch ms)
Page number
1Items per page
50Sort field (prefix with - for descending, e.g. -createdAt)
Paginated list of bets
Error response
GET /api/which-first HTTP/1.1
Host: api.bound.exchange
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
"code": "text",
"message": "text",
"data": [
{
"_id": "text",
"accountId": "text",
"coin": "text",
"evmAddress": "text",
"side": "upper_first",
"upperBound": "text",
"lowerBound": "text",
"wager": "text",
"construction": {
"direction": "long",
"leverage": 1,
"notional": "text",
"coinSize": "text",
"chosenBound": "text",
"losingBound": "text",
"takeProfitPrice": "text",
"liquidationPrice": "text",
"payoutMultiple": "text",
"payoutEstimate": "text",
"maxSlippage": "text",
"entryPrice": "text",
"assetIndex": 1,
"szDecimals": 1,
"maintenanceMarginFraction": "text",
"builderFeeRate": "text"
},
"state": "proposed",
"proposalExpiresAt": "2026-01-01T00:00:00.000Z",
"activatedAt": "2026-01-01T00:00:00.000Z",
"resolvedAt": "2026-01-01T00:00:00.000Z",
"abortReason": "proposal_expired",
"voidReason": "tp_cancelled",
"cashOutPending": true,
"boundBreachFlagged": true,
"venueRefs": {
"entryOid": "text",
"takeProfitOid": "text",
"closeOid": "text"
},
"actuals": {
"actualEntryPrice": "text",
"actualLiquidationPrice": "text",
"actualPayoutMultiple": "text",
"actualCoinSize": "text",
"actualMarginUsed": "text",
"fundingAtActivation": "text",
"finalProceeds": "text",
"feesPaid": "text",
"fundingPaid": "text",
"netProceeds": "text"
},
"relayClaimedAt": "2026-01-01T00:00:00.000Z",
"createdAt": 1,
"updatedAt": 1,
"deletedAt": "2026-01-01T00:00:00.000Z"
}
],
"metaData": {
"totalItems": 1,
"currentPage": 1,
"pageSize": 1,
"totalPages": 1
}
}Owner only. A well-formed but unknown or foreign id returns 26001 or 26002. An id that is not 24-hex does not match the route at all and returns a plain 404.
JWT access token from POST /auth/authenticate
Bet ID (24-char hex string)
6a3d1f2e3b4c5d6e7f8a9b0cSingle bet
Error response
Bet not found
GET /api/which-first/{id} HTTP/1.1
Host: api.bound.exchange
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
"code": "text",
"message": "text",
"data": {
"_id": "text",
"accountId": "text",
"coin": "text",
"evmAddress": "text",
"side": "upper_first",
"upperBound": "text",
"lowerBound": "text",
"wager": "text",
"construction": {
"direction": "long",
"leverage": 1,
"notional": "text",
"coinSize": "text",
"chosenBound": "text",
"losingBound": "text",
"takeProfitPrice": "text",
"liquidationPrice": "text",
"payoutMultiple": "text",
"payoutEstimate": "text",
"maxSlippage": "text",
"entryPrice": "text",
"assetIndex": 1,
"szDecimals": 1,
"maintenanceMarginFraction": "text",
"builderFeeRate": "text"
},
"state": "proposed",
"proposalExpiresAt": "2026-01-01T00:00:00.000Z",
"activatedAt": "2026-01-01T00:00:00.000Z",
"resolvedAt": "2026-01-01T00:00:00.000Z",
"abortReason": "proposal_expired",
"voidReason": "tp_cancelled",
"cashOutPending": true,
"boundBreachFlagged": true,
"venueRefs": {
"entryOid": "text",
"takeProfitOid": "text",
"closeOid": "text"
},
"actuals": {
"actualEntryPrice": "text",
"actualLiquidationPrice": "text",
"actualPayoutMultiple": "text",
"actualCoinSize": "text",
"actualMarginUsed": "text",
"fundingAtActivation": "text",
"finalProceeds": "text",
"feesPaid": "text",
"fundingPaid": "text",
"netProceeds": "text"
},
"relayClaimedAt": "2026-01-01T00:00:00.000Z",
"createdAt": 1,
"updatedAt": 1,
"deletedAt": "2026-01-01T00:00:00.000Z"
}
}Last updated