Skip to main content
Every order on Bravado flows through a single endpoint, 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.
Price is a decimal probability, not cents. A price of "0.62" means 62 cents per share. If you send price: "62", the API will return an error because 62 is outside the valid range of 0.001–0.999. Always express prices as decimals.

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/strategies and 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_min on GET /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 a take_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.
Always inspect warnings[] and brackets.take_profit.error / brackets.stop_loss.error in every order response. A missing bracket leg will not surface as an HTTP error. It will only appear in those fields.

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 a LIMIT order will be rejected.
  • Market order notional minimum: MARKET orders require a minimum spend of $1. Sending budget_usdc: "0.50" will be rejected.
  • Iceberg slices are post-only: each ICEBERG slice 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.
Refer to the Polymarket CLOB documentation for the full list of per-market parameters.
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.
Poll GET /v2/trade/positions?status=active to retrieve only your open positions. Omitting the status filter returns both active and closed positions, which can be a large payload for active wallets.

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

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.
The endpoint is synchronous and returns 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:
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.
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.