For the complete documentation index, see llms.txt. This page is also available as Markdown.

Read

List and read bets

List your bets

get
/api/which-first

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.

Authorizations
AuthorizationstringRequired

JWT access token from POST /auth/authenticate

Query parameters
state_eqstring · enumOptional

Filter by bet state

Possible values:
evmAddress_eqstringOptional

Filter by wallet address (must be lower-cased)

coin_eqstringOptional

Filter by asset name

side_eqstring · enumOptional

Filter by bet side

Possible values:
createdAt_gtenumberOptional

Created at lower bound (epoch ms)

createdAt_ltenumberOptional

Created at upper bound (epoch ms)

activatedAt_gtenumberOptional

Activated at lower bound (epoch ms)

activatedAt_ltenumberOptional

Activated at upper bound (epoch ms)

resolvedAt_gtenumberOptional

Resolved at lower bound (epoch ms)

resolvedAt_ltenumberOptional

Resolved at upper bound (epoch ms)

pageintegerOptional

Page number

Default: 1
pageSizeintegerOptional

Items per page

Default: 50
sortstringOptional

Sort field (prefix with - for descending, e.g. -createdAt)

Responses
200

Paginated list of bets

application/json
codestringOptional
messagestringOptional
get/api/which-first
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
  }
}

Read one bet

get
/api/which-first/{id}

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.

Authorizations
AuthorizationstringRequired

JWT access token from POST /auth/authenticate

Path parameters
idstringRequired

Bet ID (24-char hex string)

Example: 6a3d1f2e3b4c5d6e7f8a9b0c
Responses
200

Single bet

application/json
codestringOptional
messagestringOptional
get/api/which-first/{id}
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