Overview
On a spot market, a position that moves against you loses value gradually and you can usually still sell. On a prediction market it does not work that way. When the event resolves, the losing outcome is worth exactly $0, and there is nobody to sell to at any price. That makes exits more consequential here than almost anywhere else, and it also means exits have a hard limit worth understanding before you rely on them: a stop protects you against price movement, not against being wrong. Polymarket’s native API has none of these order types. This guide covers all four exit mechanisms Bravado adds, and where each one stops helping.Read time: about 14 minutes. Assumes you have placed an order. See Place an order if not.
TL;DR
STOP_LOSSreturns arecord_idand lives on/v2/trade/strategiesuntil it triggers, then becomes a CLOB order.TAKE_PROFITreturns anorder_idand rests on the book immediately, earning the spread while it waits.TRAILING_STOPfollows the high-water mark.trailing_offsetis a decimal probability;trailing_offset_pctis a percent. Mixing them up is rejected.- Brackets are best-effort. A
200does not mean both legs were placed. Checkbrackets.*.error. - An exit cannot sell more shares than you hold.
- No exit protects against resolution. Review open exits as an event approaches.
What you will do
- Place each of the three standalone exit types
- Understand why stop-loss and take-profit behave differently
- Attach both exits to an entry with a bracket, and detect when a leg fails
- Size an exit correctly against your actual holding
- Recognise where exits stop protecting you
What you will need
Knowledge- An open position, or at least an understanding of how one is created
- A Bravado API key with
trade.executeandtrade.cancel
The four mechanisms
Why stop-loss and take-profit differ
This looks like an inconsistency and is not. A take-profit is a sell above the current price. That can rest on the book straight away, because nobody will cross it until the market gets there. So it does, and it provides liquidity while it waits. A stop-loss is a sell below the current price. If it rested on the book it would fill immediately, which is the exact opposite of a stop. So Bravado holds it off-book, watches the price, and places a real order only when the trigger hits. Hence one returns anorder_id and the other a record_id, and they appear on different endpoints until the stop fires.
Stop-loss
GET /v2/trade/strategies only. After: GET /v2/trade/orders/open with is_stop_loss: true.
Take-profit
order_id. A small bonus: because it rests passively, you are providing liquidity rather than taking it if it fills.
Trailing stop
Follows the price up, fires when it reverses by your offset:0.90, the stop follows to 0.85. It never moves down.
Two offset fields, pick one
Both exist because traders think in both. The failure mode is silent if you get it backwards in the direction that stays in range, so pick one convention and keep to it.
Brackets: both exits at entry
Rather than placing exits after a fill, attach them to the entry:Legs fail independently
Size against what you hold
An exit cannot sell shares you do not have:What exits cannot do
This is the part worth internalising. A stop-loss protects against price movement. It does nothing about resolution. If a market resolves against you, the shares are worth $0, and a stop sitting at0.40 never filled because there was no bid to fill it.
Review open exits as an event approaches. A stop that has not triggered by resolution is not protection, it is an order that will never fill. See UMA resolution for the settlement lifecycle.
Wrapping up
Four mechanisms, one behavioural split worth remembering: take-profit rests, stop-loss waits. That is why they return different identifiers and appear on different endpoints. Beyond that, two habits. Checkbrackets.*.error on every bracketed entry, because a 200 does not mean protected. And treat exits as protection against price, not against being wrong, because resolution does not negotiate.
Frequently asked questions
Why does take-profit return an order_id but stop-loss a record_id?
Why does take-profit return an order_id but stop-loss a record_id?
A take-profit is a sell above the market and can rest on the book immediately. A stop-loss is a sell below the market and would fill instantly if it rested, so Bravado holds it and places the order when the trigger hits.
I cannot cancel my stop-loss.
I cannot cancel my stop-loss.
It has probably triggered. Post-trigger it is a CLOB order, so cancel it with
DELETE /v2/trade/orders/{order_id}. Look for it on open orders with is_stop_loss: true.My trailing stop was rejected.
My trailing stop was rejected.
Most likely a unit mix-up.
trailing_offset is a decimal probability, so "5" is out of range. Use "0.05" for 5 cents, or switch to trailing_offset_pct for a percentage.My order returned 200 but there is no stop on my position.
My order returned 200 but there is no stop on my position.
Check
brackets.stop_loss.error in the response. Legs fail independently of the entry, and the entry is not rolled back when one does.Can I have several exits on one position?
Can I have several exits on one position?
Yes. Partial sizes across multiple exits are common, such as taking half at a target and trailing the remainder. Just keep the total at or below your holding.
Will a stop protect me if the market resolves against me?
Will a stop protect me if the market resolves against me?
No. Resolution settles the losing outcome at $0 with no bid to fill against. Exits manage price risk, not outcome risk.
Resources
- Place an order, all eight order types
- Track order and strategy state, where exits appear
- Build a trading bot, automating exits
- UMA resolution, why exits stop working at settlement
- Order endpoints, reference
- Error reference, rejection messages