> ## Documentation Index
> Fetch the complete documentation index at: https://docs.trysoar.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Public Trades

> Every match in a market, as it happens.

A `prediction-trade` message is published for every match in a market — the
public trade tape.

## Subscribe

```json theme={null}
{"type":"subscribe","data":{"targets":[{"target":"event-market","data":{"ticker":"ANTHROPIC-VALUATION-26Q3-2.1T"}}]}}
```

Public. No credential required.

## Fields

Delivered inside a `market-update` envelope, as `data`.

| Field | Type | Description |
| - | - | - |
| `type` | string | Always `"prediction-trade"` |
| `eventMarketId` | string | UUID of the market this trade occurred in |
| `tradeId` | number | Engine sequence number for the match |
| `price` | number | Match price in cents, 1–99 |
| `qty` | number | Shares matched |
| `makerOutcome` | string | `"yes"` or `"no"` — the outcome the resting order held |
| `takerOutcome` | string | `"yes"` or `"no"` — the outcome the incoming order took |
| `takerSide` | string | `"buy"` or `"sell"` — the direction of the incoming order |
| `maker` | object? | Public profile of the resting side. Omitted if unavailable |
| `taker` | object? | Public profile of the incoming side. Omitted if unavailable |
| `ts` | number | Unix timestamp in **nanoseconds** |

### `maker` and `taker`

Trades are enriched with the public profile of each counterparty. Both are
optional — treat a missing profile as an ordinary case, not an error.

| Field | Type | Description |
| - | - | - |
| `userId` | string | Account id |
| `username` | string | Public handle |
| `avatarUrl` | string | Avatar image URL |
| `bio` | string? | Profile bio, if set |
| `twitterUsername` | string? | X handle, if linked |

These profiles are public information only. Private account fields are never
broadcast.

## Example

```json theme={null}
{
  "type": "market-update",
  "data": {
    "type": "prediction-trade",
    "eventMarketId": "9f1c2d3e-4a5b-6c7d-8e9f-0a1b2c3d4e5f",
    "tradeId": 184203,
    "price": 62,
    "qty": 40,
    "makerOutcome": "yes",
    "takerOutcome": "no",
    "takerSide": "buy",
    "maker": {
      "userId": "3b7a...",
      "username": "quietcapital",
      "avatarUrl": "https://cdn.trysoar.com/avatars/3b7a.png"
    },
    "taker": {
      "userId": "c14e...",
      "username": "ladderfan",
      "avatarUrl": "https://cdn.trysoar.com/avatars/c14e.png",
      "twitterUsername": "ladderfan"
    },
    "ts": 1789238400123456789
  }
}
```

## Notes

* **One message per match**, not per order. An order that crosses several
  resting orders produces several `prediction-trade` messages.
* `price` is the price the match executed at, always from the YES perspective.
  A NO holder's economics are `100 − price`.
* This is the public tape — it reports every trade in the market, including
  your own. For your own fills specifically, with fees and your order id, use
  [User Fills](/websockets/user-fills).


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.