Skip to main content

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_LOSS returns a record_id and lives on /v2/trade/strategies until it triggers, then becomes a CLOB order.
  • TAKE_PROFIT returns an order_id and rests on the book immediately, earning the spread while it waits.
  • TRAILING_STOP follows the high-water mark. trailing_offset is a decimal probability; trailing_offset_pct is a percent. Mixing them up is rejected.
  • Brackets are best-effort. A 200 does not mean both legs were placed. Check brackets.*.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
Tools and access
  • A Bravado API key with trade.execute and trade.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 an order_id and the other a record_id, and they appear on different endpoints until the stop fires.

Stop-loss

Before it triggers: GET /v2/trade/strategies only. After: GET /v2/trade/orders/open with is_stop_loss: true.
A stop-loss can only be cancelled pre-trigger. Once it fires the strategy completes and you are cancelling the resulting order instead, with DELETE /v2/trade/orders/{order_id}. A client that only knows how to cancel strategies will fail here.

Take-profit

Straight onto the book with an 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:
If the price runs to 0.90, the stop follows to 0.85. It never moves down.

Two offset fields, pick one

trailing_offset is a decimal probability. "0.05" trails by 5 cents. Sending "5" is rejected for falling outside the valid 0.001 to 0.999 range.If you want a percentage, use trailing_offset_pct, which takes 0 to 100.
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:
When the entry fills, both legs are submitted automatically. This closes the window where you hold an unprotected position between the fill landing and your exit order arriving, which on a fast-moving market is exactly when you need the protection.

Legs fail independently

Brackets are best-effort. If the entry fills but a leg cannot be placed, the entry is not rolled back. You hold the position with no exit attached, and the HTTP status is still 200.
Always check both:
The most common cause is a market minimum: a bracket leg below 5 shares is rejected even though the entry succeeded. If you are entering 4 shares, a bracket cannot protect it.

Size against what you hold

An exit cannot sell shares you do not have:
Read the position first, and note the unit difference: a market buy is usually expressed in dollars, but an exit is always in shares.
Partial exits are fine, and often sensible: half at the target, the rest trailing.

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 at 0.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. Check brackets.*.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

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.
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.
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.
Check brackets.stop_loss.error in the response. Legs fail independently of the entry, and the entry is not rolled back when one does.
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.
No. Resolution settles the losing outcome at $0 with no bid to fill against. Exits manage price risk, not outcome risk.

Resources