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.
Canonical venue asset name; defaults to launch asset
xyz:TSLANo content
GET /api/which-first/limits HTTP/1.1
Host: api.bound.exchange
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
No content
upper_firstPossible values: Upper bound price
110000Lower bound price
95000Positive wager / isolated margin in USDC
1000Canonical venue asset name (for example BTC or xyz:TSLA); defaults to the launch asset
xyz:TSLANo content
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"
}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).
upper_firstPossible values: Upper bound price
110000Lower bound price
95000Positive wager / isolated margin in USDC
1000Canonical venue asset name (for example BTC or xyz:TSLA); defaults to the launch asset
xyz:TSLAEVM wallet (must belong to the account) that signs/owns the Hyperliquid position
0xc12b0a4a5fdd42d1f4aa2a08c2193d1ac49c8167No content
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"
}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).
No content
POST /api/which-first/builder-fee-approval HTTP/1.1
Host: api.bound.exchange
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
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.
EVM wallet (must belong to the account) that will sign setReferrer
0xc12b0a4a5fdd42d1f4aa2a08c2193d1ac49c8167No content
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"
}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.
EVM wallet (must belong to the account) that will sign + broadcast the deposit
0xc12b0a4a5fdd42d1f4aa2a08c2193d1ac49c8167USDC amount to deposit (positive, at most 6 decimals)
10No content
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"
}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.
EVM wallet (must belong to the account) whose HyperCore USDC is withdrawn — it also RECEIVES the USDC on HyperEVM
0xc12b0a4a5fdd42d1f4aa2a08c2193d1ac49c8167USDC amount to withdraw (positive, at most 6 decimals)
10No content
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"
}No content
Page number (default: 1)
1Number of items per page (default: 10)
10Sort field and order. Use - prefix for descending. Example: -createdAt, createdAt
-createdAtFields to select (comma separated). Use + prefix to include hidden fields. Example: name,status,+holders
Relations to populate (comma separated). Example: wallet,token
No content
GET /api/which-first HTTP/1.1
Host: api.bound.exchange
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
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.
ISO-8601 window start on activatedAt, INCLUSIVE (millisecond precision kept)
2026-07-01T00:00:00.000ZISO-8601 window end on activatedAt, EXCLUSIVE (millisecond precision kept)
2026-07-31T12:00:00.123ZNo content
GET /api/which-first/open-interest HTTP/1.1
Host: api.bound.exchange
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
No content
No content
GET /api/which-first/{id} HTTP/1.1
Host: api.bound.exchange
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
No content
No content
POST /api/which-first/{id}/cash-out HTTP/1.1
Host: api.bound.exchange
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
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).
No content
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"
}
]
}No content
Last updated