Install
openclaw skills install bou-walletUse this skill when an external agent already has an agent API key and needs to call this backend directly with curl for three capability groups: (1) `POST /agent/pay-and-call` for x402-paid upstream requests. (2) `GET /agent/me` to inspect the current agent wallet/profile. (3) the `/hyperliquid` endpoints for status, balances, markets, asset data, funding, orderbook, positions, fills, ticker, order placement, cancellation, leverage updates, transfers, and withdrawals.
openclaw skills install bou-walletUse direct HTTP requests with curl. Prefer this skill when the task is to operate this backend through an existing agent bearer key instead of building a separate SDK or CLI first.
If the user has installed this skill but does not have an agent API key yet, walk them through this setup first:
https://app.bankofuniverse.org/AGENT_KEY in requestsIf the user has not completed these steps yet, do not pretend the skill can run successfully. First help them obtain a valid ak_... key.
Collect these values before making any request:
BASE_URL: use https://api.bankofuniverse.org/ unless the user explicitly gives a different backendAGENT_KEY: bearer token in ak_... formatTreat the agent key as secret. Do not print, commit, or store it in repo files.
Use the same bearer auth for all three capability groups.
curl -sS "$BASE_URL/..." \
-H "Authorization: Bearer $AGENT_KEY" \
-H "Accept: application/json"
For JSON request bodies, also add:
-H "Content-Type: application/json"
Most responses use the shared wrapper:
{
"code": 0,
"message": "",
"data": {}
}
Use POST /agent/pay-and-call when the agent needs to access an x402-protected upstream URL through this backend. Call this backend endpoint, not the merchant directly.
Body shape:
{
"url": "https://merchant.example.com/path",
"method": "GET",
"headers": {
"X-Custom-Header": "value"
},
"body": {
"query": "ETH price"
}
}
Rules:
http:// or https:// URL in urlmethodbody only when the upstream endpoint expects one>= 0.1 USDCExample:
curl -sS -X POST "$BASE_URL/agent/pay-and-call" \
-H "Authorization: Bearer $AGENT_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "https://api.example.com/search",
"method": "POST",
"body": {
"query": "BTC"
}
}'
Use these upstream URLs to quickly test the pay-and-call flow.
Upstream endpoint:
GET /cos/crypto/chainlink/randomExpected response body:
{
"number": 42
}
Example:
curl -sS -X POST "https://api.bankofuniverse.org/agent/pay-and-call" \
-H "Authorization: Bearer $AGENT_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "https://skills.bankofuniverse.org/cos/crypto/chainlink/random",
"method": "GET"
}'
Upstream endpoint:
GET /cos/crypto/price/:symbolSupported symbols:
ETHBTCUSDCUSDTTRXBNBExpected response body:
{
"symbol": "BTC",
"supportedSymbols": ["ETH", "BTC", "USDC", "USDT", "TRX", "BNB"],
"price": 84000.12,
"timestamp": 1710000000000
}
Example:
curl -sS -X POST "https://api.bankofuniverse.org/agent/pay-and-call" \
-H "Authorization: Bearer $AGENT_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "https://skills.bankofuniverse.org/cos/crypto/price/BTC",
"method": "GET"
}'
Use GET /agent/me to inspect the current agent resolved by the bearer key.
This endpoint returns the resolved agent, matched API key metadata, cumulative spent USDC, and a best-effort Base USDC balance lookup.
Example:
curl -sS "$BASE_URL/agent/me" \
-H "Authorization: Bearer $AGENT_KEY"
Use the /hyperliquid endpoints when the agent needs to inspect or trade through the backend's Hyperliquid integration. All requests use the same bearer auth pattern.
GET /hyperliquid/status
Purpose: verify the current agent is authorized to use Hyperliquid for the resolved account.
Key return fields: address is the resolved Hyperliquid account address. In agent mode, the response may also include signer-related identity information returned by the backend.
Use it when: you want to confirm the bearer key is valid and Hyperliquid access is ready before reading balances or sending orders.GET /hyperliquid/balances
Purpose: fetch the latest account balance snapshot from Hyperliquid.
Key return fields: data contains the balance payload returned by Hyperliquid for the resolved account, including available funds and account balance details.
Use it when: you need to check available funds before trading, transferring, or withdrawing.GET /hyperliquid/open-orders?coin=BTC
Purpose: list current open orders, optionally filtered by one symbol.
Key return fields: each item is normalized to include readable coin, side, and marketType; the rest of the item is the underlying open-order data.
Use it when: you want to inspect working orders before canceling or placing another order.GET /hyperliquid/markets?marketType=perp
Purpose: list supported spot or perp markets.
Key return fields: spot markets include fields such as coin, pairId, base, quote, szDecimals, weiDecimals, and marketType; perp markets include fields such as coin, base, quote, dexName, maxLeverage, szDecimals, onlyIsolated, marginMode, and marketType.
Use it when: you need to discover valid symbols, decimals, supported dex markets, or leverage-related metadata before trading.GET /hyperliquid/active-asset-data?coin=BTC
Purpose: inspect the current account trading state for one perp coin.
Key return fields: coin, leverage, isCross, leverageType, maxTradeSzs, availableToTrade, and markPx.
maxTradeSzs and availableToTrade are two-element arrays: index 0 is the BUY value and index 1 is the SELL value.
Use it when: you need the current leverage mode, tradeable size, or mark price for a perp coin before placing or sizing an order.GET /hyperliquid/funding?coin=BTC
Purpose: fetch current and next funding information for one perp market.
Key return fields: coin, fundingRate, nextFundingRate, nextFundingTimestamp, markPrice, and indexPrice.
Use it when: you want to evaluate funding cost, expected next funding, or compare mark price with oracle/index price.GET /hyperliquid/orderbook?coin=BTC
Purpose: fetch the live L2 order book for one market.
Key return fields: data is the raw Hyperliquid order book snapshot, including bid and ask levels plus the snapshot time.
Use it when: you need market depth, best bid/ask context, or raw book levels for quoting and execution logic.GET /hyperliquid/positions
Purpose: list current perp positions across available dex contexts for the account.
Key return fields: each position includes dexName, marketType, coin, szi, leverage, isCross, leverageType, entryPx, positionValue, unrealizedPnl, returnOnEquity, liquidationPx, marginUsed, maxLeverage, and cumFunding.
Use it when: you want a full view of current exposure, PnL, liquidation risk, and leverage usage.GET /hyperliquid/fills?coin=BTC&since=1710000000000&limit=100
Purpose: list historical fills for the account, optionally filtered by symbol, start time, and result count.
Key return fields: each fill is normalized to include readable coin, side, and marketType; the rest of the fill fields come from Hyperliquid's fill history.
Use it when: you want recent execution history for trade reconciliation, reporting, or strategy logic.GET /hyperliquid/ticker?coin=BTC&marketType=perp
Purpose: fetch a compact ticker-style market snapshot for one symbol.
Key return fields: coin, marketType, last, bid, ask, open, close, change, percentage, volume, quoteVolume, and timestamp.
Use it when: you need a lightweight summary of current price, spread, daily move, and volume without reading the full order book.Query rules:
marketType: perp or spotcoin: short asset symbol such as BTC or ETHlimit for fills: 1 to 500nSigFigs for orderbook: 2, 3, 4, or 5mantissa for orderbook: 2 or 5POST /hyperliquid/orderPOST /hyperliquid/cancelPOST /hyperliquid/cancel-allPOST /hyperliquid/set-leveragePOST /hyperliquid/transferPOST /hyperliquid/withdrawRequest body:
{
"coin": "BTC",
"marketType": "perp",
"orderType": "limit",
"side": "BUY",
"size": "0.001",
"price": "50000",
"reduceOnly": false,
"timeInForce": "Gtc"
}
Field rules:
orderType: market, limit, stop_limit, stop_market, or twapside: BUY or SELLsize: numeric stringprice: optional in the DTO, but required for limit-style orders such as limit and stop_limittriggerPrice: optional in the DTO, but use it for stop orders such as stop_limit and stop_markettpPrice and slPrice: optional take-profit and stop-loss valuestimeInForce: Gtc, Ioc, or AlodurationMinutes: optional in the DTO, min 5, max 1440; use it for TWAP-style flows when required by the backend logicrandomizeSlices: optional boolean for TWAP-style flowsExample:
curl -sS -X POST "$BASE_URL/hyperliquid/order" \
-H "Authorization: Bearer $AGENT_KEY" \
-H "Content-Type: application/json" \
-d '{
"coin": "BTC",
"marketType": "perp",
"orderType": "limit",
"side": "BUY",
"size": "0.001",
"price": "50000"
}'
Request body:
{
"orders": [
{
"coin": "BTC",
"orderId": 123456
}
]
}
Field rules:
orders: required array with at most 100 itemscoin: required string for each itemorderId: required integer for each item, minimum 0Request body:
{
"coin": "BTC"
}
Omit coin to cancel all open orders across supported assets.
Request body:
{
"coin": "BTC",
"leverage": 5,
"isCross": true
}
Request body:
{
"amount": "10",
"dex": "",
"fromPerp": true
}
Field rules:
amount: required numeric stringdex: optional dex name string; omit it to use the primary dex.fromPerp: optional boolean, true means transfer from perp sideUse this endpoint to withdraw Perps USDC to the Arbitrum network.
Request body:
{
"destination": "0x1234567890abcdef1234567890abcdef12345678",
"amount": "10"
}
Field rules:
destination: required EVM addressamount: required numeric stringBefore running requests:
BASE_URL is correctak_...-i when you need status codes or headers for debuggingIf a request fails, inspect the wrapped JSON message plus the HTTP status first.