POST /v2/trade/order, and a type field selects the execution strategy. Eight order types are available, ranging from simple resting limit orders to fully managed strategies like TWAP and trailing stops. Understanding which fields belong to which type, and how each type interacts with each venue, will save you time debugging unexpected rejections and miscalculated sizes.
Why Bravado over the native endpoints
Polymarket’s CLOB accepts limit and market orders. Anything more sophisticated is left to you: you build the execution engine, keep a process alive to run it, and handle every failure in between. Bravado runs that layer for you.
What that means in practice:
- A TWAP keeps running when your bot does not. Managed strategies live on Bravado’s side and expose a lifecycle you can inspect on
GET /v2/trade/strategiesand cancel on demand. A self-hosted scheduler dies with your process, mid-execution. - Retries are safe. Every mutating request takes an
Idempotency-Key. Retry a timed-out order with the same key and you get the original response back rather than a second position. See Idempotency. - Position mechanics are one call. Redeem, split, and merge are endpoints rather than raw Conditional Token Framework interactions.
- Limits are discoverable. Your quota is returned as
rate_limit_per_minonGET /v2/trade/account, so a client can read its own budget instead of hard-coding an assumption.
Fees
The Trade API charges 10 bips (0.10%) per side, applied to both the maker and the taker.
Basis points are hundredths of a percent, so 10 bips is 0.10% of notional. Fees are collected through Bravado builder codes, which are applied automatically. No configuration is required to start trading.
The builder code applied to an order is returned as
builder_code_used on the order response, and the effective code for your key is visible as builder_code_resolved on GET /v2/trade/account.
Need your own builder codes?
If you need a custom setup running your own builder codes rather than Bravado’s, reach out to support@bravadotrade.com and the team will get you configured.
Field units reference
Mismatched units are the single most common source of bugs when integrating the Trade API. Use this table as a reference whenever you build a request payload.Order type overview
Choosing a venue. Add
"venue": "predictfun" to route an order to Predict.fun; omit it (or send "polymarket") for Polymarket. The venue must be enabled for your key. Order types not yet on a venue return VENUE_CAPABILITY_UNSUPPORTED. You can also pin the venue in the path — POST /v2/trade/predictfun/order — see venue selection.Venue support
The Trade API is multi-venue. Everything below is the Polymarket reference; the venue pages document what each venue supports and where it differs.Polymarket
Full support — all eight order types, brackets, and positions (redeem/split/merge). Polygon, pUSD.
Predict.fun
LIMIT, MARKET, TWAP + positions (redeem/split/merge/withdraw). BNB Chain, USDT.
CLOB orders vs. managed strategies
Order types fall into two categories that differ in how you track and cancel them. CLOB orders (LIMIT, MARKET, TAKE_PROFIT) post directly to the Polymarket central limit order book. They return an order_id and appear on GET /v2/trade/orders/open. Cancel them with DELETE /v2/trade/orders/{order_id}.
Managed strategies (PEGGED, TWAP, ICEBERG, STOP_LOSS, TRAILING_STOP) are supervised by the Bravado execution engine, which manages their lifecycle on your behalf. They return a record_id and appear on GET /v2/trade/strategies. Cancel them with DELETE /v2/trade/strategies/{record_id}.
A
PENDING status on a managed strategy is not a rejection. It means the engine has accepted the strategy and is waiting for market conditions to satisfy its entry criteria. Monitor the strategy record rather than treating PENDING as an error state.LIMIT order example
TWAP order example
TRAILING_STOP example
Bracket orders
A bracket order attaches atake_profit and/or stop_loss leg to a LIMIT or MARKET buy entry. When the entry fills, the bracket legs are submitted automatically.
Bracket orders are best-effort: if the entry fill succeeds but a bracket leg cannot be submitted (for example, due to a market minimum), the entry is not rolled back. You still hold the position. Bravado simply records the bracket failure in the response.
Market microstructure constraints
Some rejections are enforced by the CLOB or Polymarket protocol. They are not Bravado bugs. The most common ones are:- Resting order share minimum: most markets require at least 5 shares per resting limit order. Sending
size: "1"on aLIMITorder will be rejected. - Market order notional minimum:
MARKETorders require a minimum spend of $1. Sendingbudget_usdc: "0.50"will be rejected. - Iceberg slices are post-only: each
ICEBERGslice is submitted as a passive order. For a buy, the slice price must be at or below the current best bid. Aggressive iceberg slices are not supported.
Check
warnings[] on every order response, even successful ones. Warnings surface non-fatal issues such as partial fills, clamped prices, and failed bracket legs that would otherwise be silent.Positions
Positions on Bravado represent outcome token balances held in your Polymarket Safe wallet. When you buy YES or NO shares in a Polymarket market, those ERC-1155 tokens land in your wallet and Bravado surfaces them as a position record with a live mark price, cost basis, and PnL attribution. This page explains the full lifecycle of a position, from the moment you enter a trade to the point where you redeem a resolved market.Position lifecycle
1
Open
You buy outcome token shares. Bravado creates a position record with
status: active, an average cost basis, and a live mark price derived from the CLOB midpoint.2
Partially closed
You sell a portion of your shares. The position remains
active but size decreases. Realized PnL is updated to reflect the cashflow from the partial exit.3
Fully closed or resolved
You sell all remaining shares, or the market resolves. The position moves to
status: closed. Live fields (current_value, unrealized_pnl, mark_price) are zeroed; only realized_pnl is retained.Active vs. closed positions
- Active positions
- Closed positions
An active position has a full set of live fields updated on each response:
PnL model
Bravado uses a cashflow model for realized PnL. It measures the actual USDC that flowed in and out of your wallet, net of trading fees.Realized PnL
The net USDC received from closed or partially closed positions minus the cost of the shares sold, after fees.
Unrealized PnL
The paper gain or loss on your open share balance, marked to the current CLOB midpoint.
Total PnL
The sum of both components, representing your complete economic position.
Collateral
Polymarket uses two collateral tokens, and Bravado supports both:
Call
GET /v2/trade/balances to retrieve your current balance of both tokens alongside your total portfolio value.
Redeeming resolved positions
When a Polymarket market resolves, the winning outcome token is redeemable for $1 per share. Redemption is not automatic. You must call the redeem endpoint to receive your payout.payout_base_units, the raw on-chain payout amount. Check position.redeemable === true before calling to avoid a no-op transaction.
Losing positions pay out $0 per share. This is the expected behavior of prediction markets, not a bug. Your
realized_pnl on a losing position will be negative and equal to your total cost basis.Splitting and merging outcome sets
Polymarket’s conditional token framework lets you convert pUSD directly into a complete set of outcome tokens, one YES share and one NO share per dollar, without going through the order book. Bravado exposes both directions:Split: pUSD → outcome tokens
Split: pUSD → outcome tokens
Splitting converts pUSD into one share of every outcome in a market. For a binary market, $100 of pUSD becomes 100 YES shares + 100 NO shares.When to use it: Market making. You can immediately offer both sides of the book without paying the spread.
Merge: outcome tokens → pUSD
Merge: outcome tokens → pUSD
Merging is the inverse: combining a complete set of outcome tokens (one of each outcome) back into pUSD at 1:1. You must hold at least one share of every outcome to merge.When to use it: Unwinding a split position or extracting value from a portfolio that holds both sides.

