BOU Wallet
Use 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.
First-time setup after install
If the user has installed this skill but does not have an agent API key yet, walk them through this setup first:
- Open
https://app.bankofuniverse.org/ - Sign in, then create an agent in the app
- Generate the agent API key, then copy it and use it as
AGENT_KEYin requests
If the user has not completed these steps yet, do not pretend the skill can run successfully. First help them obtain a valid ak_... key.
Required inputs
Collect these values before making any request:
BASE_URL: usehttps://api.bankofuniverse.org/unless the user explicitly gives a different backendAGENT_KEY: bearer token inak_...format
Treat the agent key as secret. Do not print, commit, or store it in repo files.
Common request pattern
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": {}
}
Capability 1: x402 pay-and-call
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:
- Send a full upstream
http://orhttps://URL inurl - Use the upstream HTTP verb in
method - Pass merchant headers as a JSON object when needed
- Pass
bodyonly when the upstream endpoint expects one - The backend enforces agent status and USDC payment limits before paying
- The backend rejects requests when the required payment is
>= 0.1USDC
Example:
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"
}
}'
x402 test cases
Use these upstream URLs to quickly test the pay-and-call flow.
Test case 1: random number
Upstream endpoint:
GET /cos/crypto/chainlink/random
Expected 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"
}'
Test case 2: crypto price
Upstream endpoint:
GET /cos/crypto/price/:symbol
Supported symbols:
ETHBTCUSDCUSDTTRXBNB
Expected 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"
}'
Capability 2: current agent info
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"
Capability 3: Hyperliquid operations
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.
Read endpoints
GET /hyperliquid/statusPurpose: verify the current agent is authorized to use Hyperliquid for the resolved account. Key return fields:addressis 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/balancesPurpose: fetch the latest account balance snapshot from Hyperliquid. Key return fields:datacontains 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=BTCPurpose: list current open orders, optionally filtered by one symbol. Key return fields: each item is normalized to include readablecoin,side, andmarketType; 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=perpPurpose: list supported spot or perp markets. Key return fields: spot markets include fields such ascoin,pairId,base,quote,szDecimals,weiDecimals, andmarketType; perp markets include fields such ascoin,base,quote,dexName,maxLeverage,szDecimals,onlyIsolated,marginMode, andmarketType. 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=BTCPurpose: inspect the current account trading state for one perp coin. Key return fields:coin,leverage,isCross,leverageType,maxTradeSzs,availableToTrade, andmarkPx.maxTradeSzsandavailableToTradeare two-element arrays: index0is theBUYvalue and index1is theSELLvalue. 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=BTCPurpose: fetch current and next funding information for one perp market. Key return fields:coin,fundingRate,nextFundingRate,nextFundingTimestamp,markPrice, andindexPrice. Use it when: you want to evaluate funding cost, expected next funding, or compare mark price with oracle/index price.GET /hyperliquid/orderbook?coin=BTCPurpose: fetch the live L2 order book for one market. Key return fields:datais 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/positionsPurpose: list current perp positions across available dex contexts for the account. Key return fields: each position includesdexName,marketType,coin,szi,leverage,isCross,leverageType,entryPx,positionValue,unrealizedPnl,returnOnEquity,liquidationPx,marginUsed,maxLeverage, andcumFunding. 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=100Purpose: list historical fills for the account, optionally filtered by symbol, start time, and result count. Key return fields: each fill is normalized to include readablecoin,side, andmarketType; 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=perpPurpose: fetch a compact ticker-style market snapshot for one symbol. Key return fields:coin,marketType,last,bid,ask,open,close,change,percentage,volume,quoteVolume, andtimestamp. 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:perporspotcoin: short asset symbol such asBTCorETHlimitfor fills:1to500nSigFigsfor orderbook:2,3,4, or5mantissafor orderbook:2or5
Write endpoints
POST /hyperliquid/orderPOST /hyperliquid/cancelPOST /hyperliquid/cancel-allPOST /hyperliquid/set-leveragePOST /hyperliquid/transferPOST /hyperliquid/withdraw
Place order
Request 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, ortwapside:BUYorSELLsize: numeric stringprice: optional in the DTO, but required for limit-style orders such aslimitandstop_limittriggerPrice: optional in the DTO, but use it for stop orders such asstop_limitandstop_markettpPriceandslPrice: optional take-profit and stop-loss valuestimeInForce:Gtc,Ioc, orAlodurationMinutes: optional in the DTO, min5, max1440; use it for TWAP-style flows when required by the backend logicrandomizeSlices: optional boolean for TWAP-style flows
Example:
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"
}'
Cancel selected orders
Request body:
{
"orders": [
{
"coin": "BTC",
"orderId": 123456
}
]
}
Field rules:
orders: required array with at most100itemscoin: required string for each itemorderId: required integer for each item, minimum0
Cancel all orders
Request body:
{
"coin": "BTC"
}
Omit coin to cancel all open orders across supported assets.
Set leverage
Request body:
{
"coin": "BTC",
"leverage": 5,
"isCross": true
}
Transfer asset
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,truemeans transfer from perp side
Withdraw asset
Use this endpoint to withdraw Perps USDC to the Arbitrum network.
Request body:
{
"destination": "0x1234567890abcdef1234567890abcdef12345678",
"amount": "10"
}
Field rules:
destination: required EVM addressamount: required numeric string
Execution checklist
Before running requests:
- Verify
BASE_URLis correct - Verify the token looks like
ak_... - Verify JSON is valid
- Verify Hyperliquid enum values match the accepted casing exactly
- Prefer the two built-in x402 test cases above when validating a new agent key
- Use
-iwhen you need status codes or headers for debugging
If a request fails, inspect the wrapped JSON message plus the HTTP status first.