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

# Markets overview

> Binary and neg-risk markets, lifecycle, and how to query them.

PredictStreet runs two market families, both resolved through the
same oracle pipeline but with different on-chain settlement adapters.

<CardGroup cols={2}>
  <Card title="Binary markets" icon="coins" href="/concepts/markets/binary">
    YES / NO on a single question. Settled through `CTFExchange`
    against `ConditionalTokens`.
  </Card>

  <Card title="Neg-risk markets" icon="chart-pie" href="/concepts/markets/neg-risk">
    3+ mutually exclusive outcomes. Settled through `NegRiskAdapter`

    * `PredictStreetNegRiskCtfExchange`.
  </Card>
</CardGroup>

## Lifecycle

```
DRAFT → PROPOSED → PRE_MARKET → OPEN → PAUSED/SUSPENDED → RESOLVED/VOIDED/CANCELLED
```

See [Market status](/concepts/markets/market-status) for the full
state machine.

## Listing markets

```http theme={null}
GET /api/markets?status=OPEN
# Public — no auth required. Sending X-Api-Key raises your rate-limit ceiling.
```

Response:

```json theme={null}
{
  "markets": [
    {
      "id": "78fe1d92-656c-4daf-af6c-c08baf7d6a1e",
      "eventId": "8e905d52-...",
      "symbol": "M1V1-RMA-MCI-959311",
      "slug": "real-madrid-vs-manchester-city-real-madrid-to-win-the-tie",
      "title": "Real Madrid (ESP) vs Manchester City (ENG) — UCL R16",
      "groupItemTitle": "Real Madrid to win the tie",
      "conditionId": "0xabc…",
      "questionId": "0xdef…",
      "yesTokenId": "12345678901234567890",
      "noTokenId": "98765432109876543210",
      "status": "OPEN",
      "currentReviewRound": 1,
      "outcomeCount": 2,
      "outcomeLabels": ["YES", "NO"],
      "initialFairValue": "0.500000",
      "initialOutcomePrices": ["0.520000", "0.480000"],
      "feeTakerBps": 140,
      "opensAt": "2026-04-23T16:00:00Z",
      "closesAt": "2026-04-30T13:30:00Z",
      "kickoff": "2026-04-30T15:48:31Z",
      "resolutionWindowHours": 24,
      "pausedAt": null,
      "resolvedAt": null,
      "payoutNumerators": null,
      "officialDataSource": "UEFA official aggregate",
      "sourceMatchId": "ucl-26-r16-rma-mci",
      "resolutionCriteria": "Settles to the team that advances on aggregate.",
      "negRiskEligible": false,
      "isNewMarketType": false,
      "createdAt": "2026-04-20T12:00:00Z",
      "updatedAt": "2026-04-20T12:00:00Z"
    }
  ]
}
```

### Polymarket-equivalent fields

| Field                  | Meaning                                                                                                                                                                                                                                                                                    |
| ---------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `slug`                 | Canonical URL-safe identifier — lowercased kebab-case derived from `event.slug` + `groupItemTitle` + `title`. Required path parameter for `GET /api/markets/{slug}` (see [Breaking change](#individual-market-detail) below). `symbol` is the operator-facing identifier and is unchanged. |
| `groupItemTitle`       | Per-market label inside a multi-market event accordion (`"Real Madrid"`, `"Liverpool"`, `"Draw"`). Equal to `title` for single-market events.                                                                                                                                              |
| `initialOutcomePrices` | Per-outcome seed prices parallel to `outcomeLabels`. Polymarket calls this `outcomePrices`.                                                                                                                                                                                                |

### On-chain identifiers

`conditionId` / `questionId` are the bytes32 hex values from
[ConditionalTokens](/concepts/contracts/conditional-tokens). `yesTokenId`
/ `noTokenId` are the ERC-1155 position ids you sign over in your
EIP-712 `Order` typed data. All four are `null` until the market's
deployment is confirmed (status `PRE_MARKET` or beyond).

For multi-outcome (neg-risk) markets `noTokenId` is `null` — each
outcome is its own YES token managed by the
[NegRiskAdapter](/concepts/contracts/neg-risk-adapter). Pull the per-outcome
token ids from the on-chain adapter via the conditionId.

See [Events overview](/concepts/events/overview) for how markets group
under events and how to filter the public catalog.

## Individual market detail

```http theme={null}
GET /api/markets/{slug}
```

<Warning>
  **Breaking change (2026-05-16)** — root market lookup is now resolved
  by **slug**, not symbol. Sending a `symbol` returns `404
    market_not_found`. The list response above carries a `slug` field
  (canonical, URL-safe, derived from the parent event + title); pass
  that value here.

  The sub-resource paths (`/orderbook`, `/trades`, `/ohlc`, `/traders`
  below) **still resolve by symbol** — only the root market detail
  endpoint changed.
</Warning>

Same shape as the list item above. For the event metadata around the
market (`group`, `stage`, `teamA`, `teamB`, `tags`, `eventStartTime`),
call `GET /api/events/{id}` with the event id from the parent grouping
(see the **Events** group in the API reference sidebar).

```bash theme={null}
# Discover slugs from the list endpoint, then fetch detail by slug.
curl "$BASE/api/markets?status=OPEN" \
  | jq -r '.markets[] | "\(.symbol)\t\(.slug)"'

curl "$BASE/api/markets/real-madrid-vs-manchester-city-real-madrid-to-win-the-tie"
```

## Orderbook snapshot

```http theme={null}
GET /api/markets/{symbol}/orderbook?outcome=0&depth=20
```

Sub-resource — still keyed by `symbol`. For live book updates, use the
`orderbook` WebSocket channel — polling is rate-limited and
latency-inferior.
