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

Which First

Per-asset bound limits (min chosen-against distance per side + max bound distance) so the FE can pre-validate bounds without a /quote round-trip.

get
Authorizations
AuthorizationstringRequired
Bearer authentication header of the form Bearer <token>.
Query parameters
coinstring · max: 128Optional

Canonical venue asset name; defaults to launch asset

Example: xyz:TSLA
Responses
200Success

No content

get/api/which-first/limits
GET /api/which-first/limits HTTP/1.1
Host: api.bound.exchange
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
200Success

No content

Price a bet — leverage, liquidation, payout estimate. Not persisted.

post
Authorizations
AuthorizationstringRequired
Bearer authentication header of the form Bearer <token>.
Body
sidestring · enumRequiredExample: upper_firstPossible values:
upperBoundstringRequired

Upper bound price

Example: 110000
lowerBoundstringRequired

Lower bound price

Example: 95000
wagerstringRequired

Positive wager / isolated margin in USDC

Example: 1000
coinstring · max: 128Optional

Canonical venue asset name (for example BTC or xyz:TSLA); defaults to the launch asset

Example: xyz:TSLA
Responses
201Success

No content

post/api/which-first/quote
POST /api/which-first/quote HTTP/1.1
Host: api.bound.exchange
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 98

{
  "side": "upper_first",
  "upperBound": "110000",
  "lowerBound": "95000",
  "wager": "1000",
  "coin": "xyz:TSLA"
}
201Success

No content

Create a PROPOSED bet: validates all gates, returns unsigned actions for the user to sign — then send the signed actions back to POST /which-first/:id/execute (the BE relays them to HL). One open bet per asset (a retry on an asset with an open bet returns existingExposure).

post
Authorizations
AuthorizationstringRequired
Bearer authentication header of the form Bearer <token>.
Body
sidestring · enumRequiredExample: upper_firstPossible values:
upperBoundstringRequired

Upper bound price

Example: 110000
lowerBoundstringRequired

Lower bound price

Example: 95000
wagerstringRequired

Positive wager / isolated margin in USDC

Example: 1000
coinstring · max: 128Optional

Canonical venue asset name (for example BTC or xyz:TSLA); defaults to the launch asset

Example: xyz:TSLA
userAddressstringRequired

EVM wallet (must belong to the account) that signs/owns the Hyperliquid position

Example: 0xc12b0a4a5fdd42d1f4aa2a08c2193d1ac49c8167
Responses
201Success

No content

post/api/which-first/proposals
POST /api/which-first/proposals HTTP/1.1
Host: api.bound.exchange
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 157

{
  "side": "upper_first",
  "upperBound": "110000",
  "lowerBound": "95000",
  "wager": "1000",
  "coin": "xyz:TSLA",
  "userAddress": "0xc12b0a4a5fdd42d1f4aa2a08c2193d1ac49c8167"
}
201Success

No content

Unsigned one-time builder-fee approval — sign with the main wallet before the first bet, then the FE POSTs the signed envelope DIRECTLY to HL /exchange (no BE relay).

post
Authorizations
AuthorizationstringRequired
Bearer authentication header of the form Bearer <token>.
Responses
201Success

No content

post/api/which-first/builder-fee-approval
POST /api/which-first/builder-fee-approval HTTP/1.1
Host: api.bound.exchange
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
201Success

No content

Unsigned one-time referral opt-in (setReferrer) — sign at first trade, then the FE POSTs the signed envelope DIRECTLY to HL /exchange (no BE relay). Returns the `{ kind, action }` IUnsignedVenueAction, or `null` when no code is configured / the wallet is already referred. Best-effort: decoupled from betting, never blocks a bet.

post
Authorizations
AuthorizationstringRequired
Bearer authentication header of the form Bearer <token>.
Body
userAddressstringRequired

EVM wallet (must belong to the account) that will sign setReferrer

Example: 0xc12b0a4a5fdd42d1f4aa2a08c2193d1ac49c8167
Responses
201Success

No content

post/api/which-first/referral
POST /api/which-first/referral HTTP/1.1
Host: api.bound.exchange
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 60

{
  "userAddress": "0xc12b0a4a5fdd42d1f4aa2a08c2193d1ac49c8167"
}
201Success

No content

Unsigned HyperEVM deposit PLAN funding the wallet's HyperCore account: `txs` = [approve, deposit] on USDC's deposit contract. SIGN AND BROADCAST BOTH txs IN ORDER on HyperEVM yourself (NORMAL eth_sendTransaction, NOT the HL SDK; `rpcUrl` is in the plan) from the SAME bound wallet you bet with — no BE broadcast.

post
Authorizations
AuthorizationstringRequired
Bearer authentication header of the form Bearer <token>.
Body
userAddressstringRequired

EVM wallet (must belong to the account) that will sign + broadcast the deposit

Example: 0xc12b0a4a5fdd42d1f4aa2a08c2193d1ac49c8167
amountstringRequired

USDC amount to deposit (positive, at most 6 decimals)

Example: 10
Responses
201Success

No content

post/api/which-first/deposit
POST /api/which-first/deposit HTTP/1.1
Host: api.bound.exchange
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 74

{
  "userAddress": "0xc12b0a4a5fdd42d1f4aa2a08c2193d1ac49c8167",
  "amount": "10"
}
201Success

No content

Unsigned sendAsset withdraw (USDC HyperCore → HyperEVM, credited to the SAME wallet — the deposit's mirror). Sign with signUserSignedAction (EIP-712 SendAsset types; add `nonce` INTO the action), then the FE POSTs the signed envelope DIRECTLY to HL /exchange (no BE relay). Positive amount, ≤6 decimals (no fixed minimum); small proportional fee.

post
Authorizations
AuthorizationstringRequired
Bearer authentication header of the form Bearer <token>.
Body
userAddressstringRequired

EVM wallet (must belong to the account) whose HyperCore USDC is withdrawn — it also RECEIVES the USDC on HyperEVM

Example: 0xc12b0a4a5fdd42d1f4aa2a08c2193d1ac49c8167
amountstringRequired

USDC amount to withdraw (positive, at most 6 decimals)

Example: 10
Responses
201Success

No content

post/api/which-first/withdraw
POST /api/which-first/withdraw HTTP/1.1
Host: api.bound.exchange
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 74

{
  "userAddress": "0xc12b0a4a5fdd42d1f4aa2a08c2193d1ac49c8167",
  "amount": "10"
}
201Success

No content

Caller's bets (paginated). Filter via query-string: `state_eq`, `evmAddress_eq`.

get
Authorizations
AuthorizationstringRequired
Bearer authentication header of the form Bearer <token>.
Query parameters
pagenumberOptional

Page number (default: 1)

Example: 1
pageSizenumberOptional

Number of items per page (default: 10)

Example: 10
sortstringOptional

Sort field and order. Use - prefix for descending. Example: -createdAt, createdAt

Example: -createdAt
selectstringOptional

Fields to select (comma separated). Use + prefix to include hidden fields. Example: name,status,+holders

populatestringOptional

Relations to populate (comma separated). Example: wallet,token

Responses
200Success

No content

get/api/which-first
GET /api/which-first HTTP/1.1
Host: api.bound.exchange
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
200Success

No content

Bound's open Which First exposure (ACTIVE bets only): totals + per-coin breakdown. Admin only. Optional half-open window on `activatedAt` via `from`/`to` (ISO-8601, millisecond precision; each bound independent, `from` inclusive, `to` exclusive). NOTE: notional is the REQUESTED notional priced at proposal time, NOT mark-to-market.

get
Authorizations
AuthorizationstringRequired
Bearer authentication header of the form Bearer <token>.
Query parameters
fromstringOptional

ISO-8601 window start on activatedAt, INCLUSIVE (millisecond precision kept)

Example: 2026-07-01T00:00:00.000Z
tostringOptional

ISO-8601 window end on activatedAt, EXCLUSIVE (millisecond precision kept)

Example: 2026-07-31T12:00:00.123Z
Responses
200Success

No content

get/api/which-first/open-interest
GET /api/which-first/open-interest HTTP/1.1
Host: api.bound.exchange
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
200Success

No content

Get one bet (owner only).

get
Authorizations
AuthorizationstringRequired
Bearer authentication header of the form Bearer <token>.
Path parameters
idstringRequired
Responses
200Success

No content

get/api/which-first/{id}
GET /api/which-first/{id} HTTP/1.1
Host: api.bound.exchange
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
200Success

No content

Prepare an unsigned cash-out bundle (cancel TP + reduce-only close) for an Active bet.

post
Authorizations
AuthorizationstringRequired
Bearer authentication header of the form Bearer <token>.
Path parameters
idstringRequired
Responses
201Success

No content

post/api/which-first/{id}/cash-out
POST /api/which-first/{id}/cash-out HTTP/1.1
Host: api.bound.exchange
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
201Success

No content

Relay the client-signed bet actions (entry bundle or cash-out bundle) to HL /exchange IN ORDER; records the resulting oids (entry→[entryOid, takeProfitOid], cash_out_close→[closeOid]) so the monitor can attach. Non-custodial — the BE only forwards the signed bodies. State-gated: an entry only relays for a still-open, unexpired proposal (else 26019 notProposed / 26011 proposalExpired), a cash-out only for an ACTIVE bet (26012 notActive).

post
Authorizations
AuthorizationstringRequired
Bearer authentication header of the form Bearer <token>.
Path parameters
idstringRequired
Body
Responses
201Success

No content

post/api/which-first/{id}/execute
POST /api/which-first/{id}/execute HTTP/1.1
Host: api.bound.exchange
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 89

{
  "actions": [
    {
      "action": {},
      "nonce": 1719400000000,
      "signature": {},
      "kind": "update_leverage"
    }
  ]
}
201Success

No content

Last updated