Skip to main content

Boros Open API

This guide walks you through integrating with the Boros trading platform via the REST API. For exact request/response schemas and parameter details, see the interactive API docs.

For key concepts and terminology, see the Glossary.

Example Repository: https://github.com/pendle-finance/boros-api-examples


Base URLs​

EnvironmentBase URL
Productionhttps://api.boros.finance
ServicePath PrefixPurpose
Open API/open-api/v1/ (or /v2/)Market data, calldata generation, account queries
Send Txs Bot/send-txs-bot/v2/ or /v3/Submitting signed transactions on-chain
Stop Order/stop-order/v1/ to /v3/Conditional TP/SL order management

API Services​

Open API (Primary)​

The main API for querying data and generating transaction calldata.

Interactive docs: https://api.boros.finance/open-api/docs

Send Txs Bot (Transaction Submission)​

Receives signed calldata from agents and broadcasts transactions on-chain. You never call smart contracts directly β€” the bot submits them on your behalf and charges gas fees from your gas balance.

Interactive docs: https://api.boros.finance/send-txs-bot/docs

Stop Order Service​

Manages conditional stop orders (take-profit / stop-loss). These orders live off-chain and are triggered automatically when the market APR crosses a threshold. See Stop Orders below for details.

Interactive docs: https://api.boros.finance/stop-order/docs


Integration Workflows​

1. First-Time Setup​

Before trading, you need to set up an agent and fund your accounts.

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ 1. Generate an agent key pair β”‚
β”‚ 2. GET /calldata/approve-agent β†’ calldata β”‚
β”‚ 3. Sign & submit approval tx (from root wallet) β”‚
β”‚ 4. GET /calldata/deposit β†’ calldata β”‚
β”‚ 5. Sign & submit deposit tx (from root wallet) β”‚
β”‚ 6. Top up gas balance for agent tx fees β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Steps 2-5 are "sensitive" actions β€” they require the root wallet signature and are submitted directly to the blockchain, not through the Send Txs Bot. The calldata endpoints return a to address (the Router contract) and the encoded calldata to include in your transaction.

See Agent Trading for the full agent setup guide.

2. Placing a Trade (Agent Flow)​

Once your agent is approved, this is the typical order placement flow:

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ 1. GET /markets/{marketId} β†’ market info β”‚
β”‚ 2. GET /simulations/place-order β†’ preview trade β”‚
β”‚ 3. POST /calldata/place-orders β†’ calldata[] β”‚
β”‚ 4. Sign each calldata with agent key β”‚
β”‚ 5. POST /send-txs-bot/v2/agent/bulk-direct-call β†’ tx hash β”‚
β”‚ 6. Subscribe to WebSocket account channel for fill updates β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Step 2 (simulation) is optional but recommended β€” it previews the margin impact, estimated fees, and validates constraints before generating calldata.

Step 3 returns an array of calldata objects. When autoExitMarket is enabled (default), the response may contain 1 or 2 calldatas: an optional exit-market calldata followed by the place-order calldata. You must submit all calldatas, not just the first one.

Step 5 sends the signed calldata(s) to the Send Txs Bot. Use bulk-direct-call when you have multiple calldatas (e.g., exit-market + place-order). Use direct-call only when you have exactly one calldata. The response includes a transaction status and hash.

skipReceipt parameter

When submitting via the Send Txs Bot, you can set skipReceipt=true to get the txHash returned immediately without waiting for block inclusion. With skipReceipt=false (default), the bot waits for the transaction to be included in a block and returns the full status and any error message. Use skipReceipt=true for lower latency when you can track the transaction status yourself.

Calldata and requireSuccess

The calldata endpoints return a list of calldatas that execute the intended action. These calldatas should be sent to the bulk-direct-call endpoint of the Send Txs Bot.

When submitting via bulk-direct-call, use the requireSuccess parameter to control atomicity:

  • requireSuccess=true (recommended for most actions) β€” All calldatas either succeed together or fail together. Use this for actions like place-order with autoExitMarket, where the exit-market and place-order calldatas must both execute or neither should.
  • requireSuccess=false β€” Each calldata is executed independently; some may succeed while others fail. This is useful specifically for place-orders when you want to place multiple orders and don't need them to be atomic (e.g., if one order fails due to insufficient margin, the others can still go through).

3. Closing a Position​

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ 1. POST /accounts/market-acc-infos β†’ current position β”‚
β”‚ 2. GET /simulations/close-active-position β†’ preview close β”‚
β”‚ 3. POST /calldata/place-orders β†’ counter-order β”‚
β”‚ 4. Sign & submit via Send Txs Bot β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Closing a position internally creates a counter-order (opposite side, same size). The simulation endpoint handles this logic for you.

4. Withdrawing Funds​

Withdrawals follow a request β†’ cooldown β†’ finalize pattern:

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ 1. GET /calldata/withdraw-request β†’ request calldata β”‚
β”‚ 2. Sign & submit withdrawal request (root wallet) β”‚
β”‚ 3. Wait for cooldown period β”‚
β”‚ 4. Finalize withdrawal on MarketHub contract β”‚
β”‚ β”‚
β”‚ To cancel: GET /calldata/withdraw-cancel β†’ cancel calldata β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Withdrawal requests and cancellations are sensitive actions signed by the root wallet.

5. Setting Up Stop Orders (TP/SL)​

Stop orders are conditional orders that execute automatically when the market APR hits your target:

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ 1. GET /stop-order/v1/orders/tpsl/prepare β†’ order params β”‚
β”‚ 2. POST /stop-order/v2/orders/place β†’ place order β”‚
β”‚ β”‚
β”‚ To cancel: DELETE /stop-order/v3/orders/cancel β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

The prepare endpoint generates the order parameters (including the calldata that will be executed when triggered). The place endpoint submits the signed conditional order. See Stop Orders for details.


Sensitive vs Non-Sensitive Actions​

Understanding this distinction is critical for integration:

TypeSigned bySubmitted viaExamples
SensitiveRoot walletDirect to blockchainDeposit, withdraw, approve/revoke agent
Non-sensitiveAgent keySend Txs BotPlace orders, cancel orders, cash transfer, enter/exit markets

Sensitive actions require the root wallet's private key and are submitted as regular Ethereum transactions. Non-sensitive actions are signed by the agent and submitted through the Send Txs Bot service, which handles gas and on-chain submission.


Endpoint Categories​

Assets​

Query available collateral tokens with metadata and current prices.

EndpointDescription
GET /assets/allList all supported collateral assets

Markets​

Query market configurations, order books, and trade history.

EndpointDescription
GET /marketsList all markets with current state and pricing. Includes isWhitelisted field.
GET /markets/{marketId}Get a single market's details
GET /markets/order-booksAggregated order book by tick size. (Deprecated β€” use v2)
GET /v2/markets/order-booksOrder book with optional AMM liquidity. Response includes syncStatus (blockNumber + timestamp).
GET /markets/market-tradesRecent executed trades
GET /markets/chartOHLCV candlestick data

Accounts​

Query and manage user account state.

EndpointDescription
POST /accounts/market-acc-infosPositions, margins, balances for market accounts. See details below.
GET /accounts/entered-marketsMarkets entered by a cross-margin account
GET /accounts/active-positionsAll active positions for a user. See details below.
GET /accounts/latest-settlementsLatest settlement per market position. See details below.
GET /accounts/limit-ordersActive/inactive limit orders. (Deprecated β€” use v2)
GET /accounts/transactionsTrade history. (Deprecated β€” use v2)
GET /accounts/settlementsFunding rate settlement history
GET /accounts/transfer-logsDeposit/withdrawal transfer logs. (Deprecated β€” use v2)
GET /accounts/gas-balanceCurrent gas balance
GET /accounts/gas-consumption-historyGas usage history. (Deprecated β€” use v2)
GET /accounts/settingsUser account settings
POST /accounts/settingsUpdate settings (agent-signed)

Market Acc Infos​

POST /accounts/market-acc-infos β€” Returns detailed account information for one or more market accounts. Accepts an array of up to 100 marketAccs in the request body.

Response fields (per market account):

FieldTypeDescription
totalCashstringTotal cash balance (bigint string in settlement token)
netBalancestringEquity = totalCash + sum of all position values
positionsarrayList of active positions (size, rate, entry block, etc.)
initialMarginstringRaw initial margin without leverage
initialMarginWithLeveragestringInitial margin with leverage applied
availableInitialMarginstringRemaining margin available for new positions
availableMaintMarginstringRemaining margin before liquidation (health ratio = 1.0 when zero)

Response includes syncStatus (blockNumber + timestamp).

Active Positions​

GET /accounts/active-positions β€” Returns all active (non-zero size) positions for a user's account. Query params: userAddress, accountId.

Response fields (per position):

FieldTypeDescription
marketIdnumberMarket identifier
marketAccMarketAccPacked account position identifier
isCrossbooleanWhether the position uses cross-margin mode
fixedAprnumberThe fixed APR of the position (e.g. 0.05 = 5%)
signedSizestringBigint string of signed position size (negative = short)
sideSide0 = Long, 1 = Short
cumulativePnlstringBigint string of all-time cumulative trade PnL
isMaturedbooleanWhether the market has reached its maturity date

Response includes syncStatus (blockNumber + timestamp).

Latest Settlements​

GET /accounts/latest-settlements β€” Returns the most recent settlement for each market that a user's account has participated in. Query params: userAddress, accountId.

Response fields (per settlement):

FieldTypeDescription
marketIdnumberMarket identifier
marketAccMarketAccPacked account position identifier
isCrossbooleanWhether the position uses cross-margin mode
isMaturedbooleanWhether the market has reached maturity
timestampnumberTimestamp of the latest settlement
sideSidePosition side at time of settlement (0 = Long, 1 = Short)
positionSizestringBigint string of position size at settlement
yieldPaidstringBigint string of yield paid in the latest settlement period
yieldReceivedstringBigint string of yield received in the latest settlement period
settlementstringNet settlement = yieldReceived βˆ’ yieldPaid
settlementRatenumberAnnualized settlement rate of the latest period (e.g. 0.05 = 5%)
cumulativeSettlementPnlstringAll-time cumulative settlement PnL
sinceOpenSettlementPnlstringCumulative settlement PnL since position was opened

Response includes syncStatus (blockNumber + timestamp).

V2 Accounts (Cursor-Based Pagination)​

The v2 endpoints replace the v1 offset-based pagination (skip/limit/total) with cursor-based pagination using a resumeToken. This is significantly more efficient for large datasets.

How it works:

  1. Make the initial request with limit (no resumeToken)
  2. The response includes a resumeToken string β€” pass it as a query parameter on the next request to get the next page
  3. When resumeToken is null, there are no more pages

All v2 responses also include a syncStatus field (blockNumber + timestamp) indicating how up-to-date the backend data is.

EndpointDescription
GET /v2/accounts/limit-ordersLimit orders sorted by last updated. Supports marketId, isActive, orderType filters. Max limit: 2000.
GET /v2/accounts/all-limit-ordersAll limit orders sorted by placed order. Guarantees no missed orders during pagination β€” use this for syncing/indexing.
GET /v2/accounts/transactionsTrade history with cursor pagination. Supports fromBlockNumber, toBlockNumber, isLimitOrderTrade filters. Max limit: 2000.
GET /v2/accounts/transfer-logsDeposit/withdrawal logs with cursor pagination. Max limit: 100.
GET /v2/accounts/gas-consumption-historyGas usage history with cursor pagination. Max limit: 100.
Which limit-orders endpoint to use?
  • /v2/accounts/limit-orders β€” sorted by last updated (eventIndex). Best for showing recent activity in a UI. Note: orders updated during pagination may shift position, so you might miss or duplicate some entries.
  • /v2/accounts/all-limit-orders β€” sorted by immutable placed timestamp (placedEventIndex). Guarantees stable pagination β€” use this for syncing all orders.

New response fields on limit orders:

  • placedTxHash β€” the transaction hash where the order was originally placed

Calldata Generation​

Generate transaction calldata for on-chain operations.

Sensitive (root-signed, direct to chain):

EndpointDescription
GET /calldata/depositDeposit collateral to margin account
GET /calldata/withdraw-requestRequest withdrawal
GET /calldata/withdraw-cancelCancel pending withdrawal
GET /calldata/approve-agentApprove an agent
GET /calldata/revoke-agentRevoke an agent
GET /calldata/vault-pay-treasuryPay treasury from vault

Non-sensitive (agent-signed, via Send Txs Bot):

EndpointDescription
POST /calldata/place-ordersPlace one or more limit orders
POST /calldata/place-orders-with-ratePlace orders with an explicit desired rate (instead of slippage)
GET /calldata/cancel-orderCancel orders
GET /calldata/cash-transferTransfer between cross and isolated accounts
GET /calldata/enter-exit-marketsEnter or exit markets
GET /calldata/pay-treasuryPay accrued treasury fees
GET /calldata/add-liquidity-single-cash-to-ammAdd AMM liquidity
GET /calldata/remove-liquidity-single-cash-from-ammRemove AMM liquidity

Simulations​

Preview operations before executing them. All simulation endpoints return the projected account state after the operation.

EndpointDescription
GET /simulations/depositPreview deposit effect on account
GET /simulations/withdrawPreview withdrawal effect on account
GET /simulations/cash-transferPreview cross ↔ isolated transfer
GET /simulations/place-orderPreview order placement with fees
GET /simulations/close-active-positionPreview closing a position
GET /simulations/add-liquidity-single-cashPreview adding AMM liquidity
GET /simulations/remove-liquidity-single-cashPreview removing AMM liquidity

Funding Rate​

Access funding rate data and settlement history.

EndpointDescription
GET /funding-rate/all-funding-rate-symbolsAvailable funding rate symbols
POST /funding-rate/settlement-summaryHistorical settlement summaries

Agents​

Manage agent authorization.

EndpointDescription
GET /agents/expiry-timeCheck agent expiry time

Events​

Query protocol events.

EndpointDescription
GET /events/liquidation-eventsLiquidation event history

Charts​

Charting data for trading UIs.

EndpointDescription
GET /charts/ohlcvOHLCV candlestick data

Leaderboard​

Query trading leaderboard data.

EndpointDescription
GET /leaderboardTrading leaderboard with rankings
GET /leaderboard/searchSearch for a specific user on the leaderboard

Transaction Status (Send Txs Bot)​

Query transaction status with detailed on-chain event data.

EndpointDescription
POST /send-txs-bot/v2/agent/dedicated/tx-statusTransaction status with block info
POST /send-txs-bot/v2/agent/dedicated/tx-status-with-eventsTransaction status with parsed limit order events (placed, cancelled, market order executed). Each status item includes limitOrdersPlaced (orderIds + sizes), limitOrdersCancelled (orderIds), and marketOrdersExecuted (orderId, side, size).

Error Handling​

The Open API returns errors in a structured format:

{
"errorCode": "INVALID_MARKET_ID",
"message": "Market with ID 999 not found",
"data": {}
}

The errorCode field is a machine-readable string you can use for programmatic error handling. Common error codes include validation errors (invalid parameters), state errors (insufficient margin), and not-found errors.

The Send Txs Bot and Stop Order services use the legacy format:

{
"statusCode": 400,
"message": "Invalid signature"
}

See Best Practices for error handling recommendations.


Rate Limiting​

The API does not currently enforce strict rate limits, but excessive request rates may be throttled. Recommendations:

  • Use WebSocket for real-time data instead of polling
  • Use bulk order endpoints instead of multiple single-order calls
  • Cache market and asset data that doesn't change frequently

Code Examples​

For complete working examples covering the full integration lifecycle, see:

https://github.com/pendle-finance/boros-api-examples

Key examples:

  • 01-agent.ts β€” Agent setup and approval
  • 02-deposit.ts to 04-withdraw.ts β€” Fund management
  • 05-place-order.ts to 08-cancel-order.ts β€” Order lifecycle
  • 11-bulk-place-orders.ts β€” Bulk order placement
  • 12-top-up-gas-account.ts β€” Gas management
  • 13-top-up-isolated-account.ts β€” Isolated margin funding