> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.getsinbad.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.getsinbad.com/_mcp/server.

# Trade lifecycle

> Follow a trade from funded escrow to a final outcome, and see who can act in each status.

A trade starts when its escrow is funded and confirmed on chain, and it ends with `RELEASED` or `CANCELED`. Before funding there is only a breakdown. This page explains each step, and the status table at the end shows who can act in each state.

## 1. Fund the escrow

Create a breakdown, handle any token approvals and have the customer's wallet execute the prepared escrow transaction. Then report it through [`POST /v1/transactions`](https://docs.getsinbad.com/api-reference/transactions/submit-prepared-transaction). The breakdown holds the customer's open trade on that side until the trade ends, the customer opens a dispute or the breakdown expires. See [One open trade per side](/offers-quotes#one-open-trade-per-side).

## 2. Wait for confirmation

Submit the transaction hash or the signed transaction, then wait for the breakdown to show `CONFIRMED` or for the trade to appear as `CREATED`. No trade exists before funding. Sinbad also detects funding directly from the chain. Use [`GET /v1/transactions/{preparationId}`](https://docs.getsinbad.com/api-reference/transactions/get-prepared-transaction-status), [`GET /v1/trade-breakdowns/{breakdownId}`](https://docs.getsinbad.com/api-reference/offers-and-breakdowns/get-trade-breakdown) and [`GET /v1/trades/{tradeId}`](https://docs.getsinbad.com/api-reference/trades/get-partner-trade) to follow it.

## 3. Exchange messages and evidence

Use the same trade ID for chat and payment proof. The merchant continues to use the Sinbad app. See [Chat and images](/trade-chat) and [Payment proof](/payment-proof).

## 4. Choose a permitted action

Each action has its own page with the role, state, timing and complete prepare and submit examples:
[`markPaid`](/trade-actions/mark-paid), [`release`](/trade-actions/release), [`cancelPrePaid`](/trade-actions/cancel-pre-paid), [`openDispute`](/trade-actions/open-dispute) and [`mutualResolveDispute`](/trade-actions/mutual-resolve-dispute). See also [Trade actions](/trade-actions).

## Trade statuses and actions

![Trade status diagram](/_fern-files/sinbad.docs.buildwithfern.com/53e111db009035a00deab97b63bf83e770aa542c83d5583a544a0bcdcfac7ea1/assets/diagrams/trade-status.svg)

A trade exists only after funding is confirmed on chain, and its first status is `CREATED`. Confirmed on-chain events change the status, in block order. You can read the status with [`GET /v1/trades/{tradeId}`](https://docs.getsinbad.com/api-reference/trades/get-partner-trade) and receive it in the [`trade.created`](/webhook-events/trade-created) and [`trade.updated`](/webhook-events/trade-updated) webhooks. Do not wait for `PENDING`, `FUNDING_FAILED` or `FUNDING_EXPIRED`. Sinbad does not produce them, and before funding is confirmed there is only a breakdown.

| Status     | Meaning                                                                                   | What moves it on                                                                                                                                 |
| ---------- | ----------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ |
| `CREATED`  | Funding is confirmed on chain. The trade exists.                                          | BUY customer: `markPaid` or `cancelPrePaid`. SELL customer: waits for the fiat, or opens a dispute after the dispute window.                     |
| `PAID`     | The fiat payer marked the payment as sent: the customer on a BUY, the merchant on a SELL. | SELL customer: `release` or `openDispute`. BUY customer: `openDispute` after the dispute window.                                                 |
| `DISPUTED` | A dispute is open.                                                                        | The customer: `mutualResolveDispute`, a resolution signed by the customer only. Or Sinbad support. The trade then ends `RELEASED` or `CANCELED`. |
| `RELEASED` | Final. The crypto went to the buyer.                                                      | Nothing.                                                                                                                                         |
| `CANCELED` | Final. The crypto went back to the seller who locked it.                                  | Nothing.                                                                                                                                         |

`availableActions` on a trade lists candidate actions. The real check happens when you prepare an action. If you prepare `openDispute` too early, it fails with `409 CONFLICT` and `details.reason: "TOO_EARLY"`. When the customer opens a dispute, their open trade on that side is released. A dispute that the merchant opens does not release it.