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

# Changelog

> Updates and new features for the Predexon API and WebSocket service

<Update label="July 20, 2026" tags={["Removed"]}>
  ## Market-matching endpoints removed

  The cross-venue market-matching endpoints, deprecated on July 14, have been sunset and now return `410 Gone`:

  * `GET /v2/matching-markets`
  * `GET /v2/matching-markets/pairs`
  * `GET /v2/markets`
  * `GET /v2/markets/listings`
  * `GET /v2/outcomes/{predexon_id}`

  Sports live-state updates have also concluded with the end of the FIFA World Cup: the `sports_live` and `sports_fifa_world_cup` WebSocket channels no longer emit events, and `/v2/sports/fifa-world-cup/live-games` continues to serve final game states.

  All venue-specific data endpoints, discovery, analytics, tick history, and the WebSocket service are unaffected. Questions? [team@predexon.com](mailto:team@predexon.com).
</Update>

<Update label="July 15, 2026" tags={["New"]}>
  ## Sub-cent Kalshi orderbook history

  New endpoint: [`GET /v2/kalshi/orderbooks-subcent`](/api-reference/kalshi/orderbooks-subcent). Kalshi prices markets in sub-cent increments, and this endpoint reflects those prices exactly: decimal price levels, spreads as tight as they really are, fractional contract sizes, plus per-snapshot `source` provenance and a `sources` filter. History from January 8th, 2026. Free and unlimited like the legacy endpoint.

  **The legacy integer-cent [`GET /v2/kalshi/orderbooks`](/api-reference/kalshi/orderbooks) will be deprecated soon.** It rounds prices to whole cents, which widens spreads and merges neighboring price levels. Switch to the sub-cent endpoint now; the deprecation date will be announced here. The legacy `limit` cap was also raised to 2000 (docs previously said 200).
</Update>

<Update label="July 14, 2026" tags={["Deprecated"]}>
  ## Market-matching endpoints deprecated

  The cross-venue market-matching endpoints are deprecated as of July 14, 2026 and scheduled for sunset:

  * `GET /v2/matching-markets`
  * `GET /v2/matching-markets/pairs`
  * `GET /v2/markets`
  * `GET /v2/markets/listings`
  * `GET /v2/outcomes/{predexon_id}`

  The endpoints remain available during a transition window. `GET /v2/markets/search` (cross-venue text search) is **not** affected, and all venue-specific data endpoints, sports endpoints, and the WebSocket service continue unchanged.

  If your integration depends on the deprecated endpoints, please contact us to discuss alternatives.
</Update>

<Update label="July 10, 2026" tags={["Removed"]}>
  ## Trading disabled — withdrawal-only mode in effect

  As announced, the Trading API is now **withdrawal-only**. Order placement (`POST /api/accounts/{accountId}/orders`) returns `403 trading_disabled` on every venue. Cancel, redeem, balance, positions, transfers, and withdrawals keep working.

  * **July 17, 2026** — final withdrawal deadline. Cancel open orders, redeem resolved positions, and withdraw all funds by this date.

  These dates supersede the June 25 / June 29 dates in the June 21 entry below — the wind-down timeline was extended to July 10 / July 17.

  Questions, or need help withdrawing? Reach out at [team@predexon.com](mailto:team@predexon.com).
</Update>

<Update label="July 11, 2026" tags={["New"]}>
  ## Trades: multi-wallet filtering and hash lookups

  Two additions to [`GET /v2/polymarket/trades`](/api-reference/trading/trades). No breaking changes: all existing requests, response shapes, and pagination cursors are unaffected.

  ### Multi-wallet filtering

  The `wallet` parameter now accepts a comma-separated list of up to 50 addresses (previously one):

  ```
  GET /v2/polymarket/trades?wallet=0xabc...,0xdef...,0x123...&limit=100
  ```

  * Returns one merged feed of all listed wallets' trades, time-ordered (newest first by default), with standard cursor pagination — designed for tracking a list of followed wallets.
  * Address order doesn't matter and duplicates are ignored; the same list in any order returns identical results and pagination keys.
  * Trades match on the maker side, same as the existing single-wallet filter.
  * Combines with all existing parameters (`market_slug` / `condition_id` / `token_id`, `start_time` / `end_time`, `min_total`, `order`, `pagination_key`).
  * Errors: more than 50 addresses returns `400`; any invalid address returns `400` identifying which one.
  * Fully backward compatible: single-address requests behave exactly as before, and existing pagination keys remain valid.

  ### Order hash and transaction hash filters

  Two new optional parameters (each `0x` + 64 hex chars):

  | Parameter    | Returns                                                                  |
  | ------------ | ------------------------------------------------------------------------ |
  | `tx_hash`    | all fills executed in that transaction                                   |
  | `order_hash` | all fills of that order (an order can fill across multiple transactions) |

  ```
  GET /v2/polymarket/trades?tx_hash=0x52e2...42e8
  GET /v2/polymarket/trades?order_hash=0xdd14...33b1
  ```

  * Usable standalone (full-history point lookup, back to October 2022) or combined with each other and with any wallet/market/time filters.
  * Invalid hash format returns `400`.
</Update>

<Update label="July 10, 2026" tags={["New", "Deprecated"]}>
  ## Exact lifetime buy totals: `total_bought_usd`

  Position responses now include a new field, `total_bought_usd`: the exact total USD ever spent buying a position, cumulative over its lifetime and preserved even after redemption. It is computed from on-chain fills and verified against them.

  Available on both position endpoints:

  | Endpoint                                       | Docs                                                |
  | ---------------------------------------------- | --------------------------------------------------- |
  | `GET /v2/polymarket/wallet/positions/{wallet}` | [Wallet Positions](/api-reference/wallet/positions) |
  | `GET /v2/polymarket/positions`                 | [Positions](/api-reference/trading/positions)       |

  ### `total_shares_bought` is deprecated

  Use `total_bought_usd` instead. The share-count derivation behind `total_shares_bought` is approximate for positions that were fully closed and later reopened at a different price, which can make it diverge significantly from the true buy total. The field is **not** being removed and its values are unchanged — existing clients see one extra JSON key and nothing else changes.

  ### Orderbook snapshot limit raised

  `GET /v2/polymarket/orderbooks` and `GET /v2/kalshi/orderbooks` now accept `limit` up to **2000** (previously 200). The default remains 100.
</Update>

<Update label="June 21, 2026" tags={["Deprecated", "Removed"]}>
  ## Trading API is being retired

  The custodial **Trading API** (Unified Execution Infra) is winding down. The read-only **[Data & Signals API](/data-signals/overview)** is unaffected.

  * **June 25, 2026** — trading stops. Sell or close any open positions before this date. After it, the Trading API is withdrawal-only (cancel, redeem, withdraw).
  * **June 29, 2026** — final withdrawal deadline. Redeem resolved positions and withdraw all funds by this date.

  New account creation and API key issuance are already closed — `POST /api/accounts/create` returns `403`.

  ### Order Router removed

  The Unified Order Router (`/api/accounts/{accountId}/router/*`) has been retired and its documentation removed. Until trading stops on June 25, place orders directly with [venue-specific orders](/trading-api/accounts/place-order).

  Questions, or need help withdrawing? Reach out at [team@predexon.com](mailto:team@predexon.com).
</Update>

<Update label="June 20, 2026" tags={["Removed"]}>
  ## Dflow endpoints removed

  The Dflow venue is deprecated. The three Data API endpoints below have been removed and now return `404`. The corresponding MCP tools have been removed as well.

  | Endpoint                                  | MCP tool              |
  | ----------------------------------------- | --------------------- |
  | `GET /v2/dflow/trades`                    | `get_dflow_trades`    |
  | `GET /v2/dflow/wallet/positions/{wallet}` | `get_dflow_positions` |
  | `GET /v2/dflow/wallet/pnl/{wallet}`       | `get_dflow_pnl`       |

  If you were depending on Dflow data, reach out at [team@predexon.com](mailto:team@predexon.com) so we can scope a replacement path.
</Update>

<Update label="May 29, 2026" tags={["New", "Changed"]}>
  ## New endpoints

  <CardGroup cols={2}>
    <Card title="Wallet Builder Fees" icon="hand-holding-dollar" href="/api-reference/builders/wallet-builder-fees">
      `GET /v2/polymarket/builders/wallet/{wallet}`. Total builder fees a wallet has paid over a rolling window or an exact `start_time`/`end_time` range, with a per-builder breakdown and optional `builder_code` filter. Each fill is scored at the rate in effect at the time it filled.
    </Card>

    <Card title="Position Top Holders" icon="trophy" href="/api-reference/analytics/position-top-holders">
      `GET /v2/polymarket/position/{token_id}/top-holders`. Largest holders of a single token (one outcome side), ranked by position size, with cursor pagination.
    </Card>
  </CardGroup>

  ## Polymarket Discovery & Taxonomy

  Seven new endpoints for browsing and navigating Polymarket — categories, tags, series, and a unified search. These power navigation surfaces and autocomplete on top of the markets and events data.

  <CardGroup cols={2}>
    <Card title="Unified Search" icon="magnifying-glass" href="/api-reference/discovery/search">
      `GET /v2/polymarket/search`. One query across markets, events, and tags, grouped by type.
    </Card>

    <Card title="Categories" icon="grid-2" href="/api-reference/discovery/categories">
      `GET /v2/polymarket/categories`. Top-level categories with market counts, volume, and liquidity.
    </Card>

    <Card title="Tags" icon="tags" href="/api-reference/discovery/tags">
      `GET /v2/polymarket/tags`, `GET /v2/polymarket/tag/{slug}`, and `GET /v2/polymarket/tag/{slug}/subtags`. Curated tags with rolled-up volume/liquidity metrics, single-tag detail, and ranked child subtags.
    </Card>

    <Card title="Series" icon="repeat" href="/api-reference/discovery/series">
      `GET /v2/polymarket/series` and `GET /v2/polymarket/series/{slug}`. Recurring market groupings (daily/weekly/monthly) plus a series' events. The crypto up/down feature is just a named series.
    </Card>
  </CardGroup>

  ## Improvements

  [`GET /v2/polymarket/events`](/api-reference/markets/events) (keyset) gained optional `include_markets` (nest each event's markets inline, capped by `markets_per_event`) plus `min_open_interest` and `min_volume` filters to return only liquid events. Events also now include an all-time trade count (`trades_all_time`).

  Per-tag and per-category open interest has been removed from the [categories](/api-reference/discovery/categories) and [tags](/api-reference/discovery/tags) endpoints — a tag/category-wide OI sum was unreliable. Rank by volume (`total_volume_usd`, `rolling_metrics`) and `liquidity_usd` instead. Both surfaces also gained `trades_all_time`.

  ## Behavioral changes

  A few request defaults and constraints changed. Set parameters explicitly if you were relying on the previous defaults.

  | Endpoint                                                                                                               | Parameter        | Before                    | Now                                                                            |
  | ---------------------------------------------------------------------------------------------------------------------- | ---------------- | ------------------------- | ------------------------------------------------------------------------------ |
  | [`GET /v2/markets`](/api-reference/canonical/markets), [`GET /v2/markets/listings`](/api-reference/canonical/listings) | `status`         | no default (all statuses) | defaults to `open` — also accepts `closed`, `resolved`, `all`                  |
  | [`GET /v2/markets`](/api-reference/canonical/markets), [`GET /v2/markets/listings`](/api-reference/canonical/listings) | `limit`          | default `20`              | default `50` (max `200`)                                                       |
  | [`GET /v2/markets`](/api-reference/canonical/markets), [`GET /v2/markets/listings`](/api-reference/canonical/listings) | `search`         | any length                | must be 3–200 characters                                                       |
  | [`GET /v2/polymarket/wallet/positions/{wallet}`](/api-reference/wallet/positions)                                      | `include_closed` | default `true`            | default `false` — pass `include_closed=true` for closed/zero-balance positions |

  <Warning>
    **Pagination shape change on the Polymarket offset list endpoints.** `GET /v2/polymarket/markets` and `GET /v2/polymarket/events` now return `pagination: { has_more, limit, count, pagination_key }` — the `offset` and `total` fields have been removed. Migrate to the cursor-based [List Markets](/api-reference/markets/list-markets) / [List Events](/api-reference/markets/events) flow using `pagination_key`.
  </Warning>
</Update>

<Update label="May 20, 2026" tags={["New", "Beta"]}>
  ## Canonical Markets API

  Four new venue-agnostic endpoints exposing Predexon's canonical outcome graph. These are the data layer the Order Router quotes against and the entry point for any cross-venue workflow.

  <CardGroup cols={2}>
    <Card title="List Canonical Markets" icon="list" href="/api-reference/canonical/markets">
      `GET /v2/markets`. Cross-venue canonical market containers with outcome-level `predexon_id`s.
    </Card>

    <Card title="Canonical Venue Listings" icon="layer-group" href="/api-reference/canonical/listings">
      `GET /v2/markets/listings`. Flatten canonical markets into venue-native executable listings (token IDs, condition IDs, Kalshi tickers, market slugs).
    </Card>

    <Card title="Resolve a Canonical Outcome" icon="link" href="/api-reference/canonical/outcome">
      `GET /v2/outcomes/{predexon_id}`. Resolve one canonical outcome ID to its full venue-equivalent listings.
    </Card>

    <Card title="Search Across Venues" icon="magnifying-glass" href="/api-reference/matching/search">
      `GET /v2/markets/search`. Keyword search returning interleaved results across Polymarket, Kalshi, Limitless, Opinion, and Predict.fun.
    </Card>
  </CardGroup>

  <Note>
    All four canonical endpoints are **free and unlimited** on every plan. Category and league filters supported. Cursor-based pagination.
  </Note>

  ## Order Router

  <Card title="New: Route a single order across every venue" icon="route" href="/trading-api/guides/order-router">
    One canonical outcome, one order, every venue. The router quotes across Polymarket, Predict.fun, Opinion, Limitless, and Hyperliquid, splits the order fee-aware, and dispatches each leg to its matching venue.
  </Card>

  **Endpoints:**

  * [`POST /api/accounts/{accountId}/router/quote`](/trading-api/router/quote). Pre-trade quote: project the best fill across every matched venue.
  * [`POST /api/accounts/{accountId}/router/orders`](/trading-api/router/place-order). Place a routed order.
  * [`GET /api/accounts/{accountId}/router/orders`](/trading-api/router/list-orders). List routed orders.
  * [`GET /api/accounts/{accountId}/router/orders/{routerOrderId}`](/trading-api/router/get-order). Get a routed order.
  * [`DELETE /api/accounts/{accountId}/router/orders/{routerOrderId}`](/trading-api/router/cancel-order). Cancel a routed order.

  The router uses Predexon's canonical outcome graph to identify equivalent markets across venues. See the [Order Router guide](/trading-api/guides/order-router) for the full flow.

  ## Unified Transfers

  <Card title="New: One endpoint for every fund movement" icon="arrow-right-arrow-left" href="/trading-api/guides/funding-and-withdrawals">
    `POST /api/accounts/{accountId}/transfers` replaces separate deposit and withdraw flows. One verb covers movement between the deposit wallet, venue trading wallets, and external addresses.
  </Card>

  * `POST /api/accounts/{accountId}/transfers/quote`. Project route and fees before committing.
  * `POST /api/accounts/{accountId}/transfers`. Execute the transfer.
  * [`GET /api/accounts/{accountId}/transfers`](/trading-api/funds/list-transfers). List transfers with status.
  * `GET /api/accounts/{accountId}/transfers/{transferId}`. Status of a single transfer.

  <Note>
    **Beta.** Router and Transfers endpoints are marked beta. Existing per-venue order endpoints (`POST /api/accounts/{accountId}/orders`) continue to work unchanged.
  </Note>

  ## Other improvements

  * **\$1 bridge minimum** documented on Across-routed deposits.
  * **Router 4xx errors** moved from `502` to `400` in the OpenAPI spec to match shipped behavior.
  * **Deposit-wallet behavior** synced with deployed router.
</Update>

<Update label="May 18, 2026" tags={["Breaking Change", "Improvement"]}>
  ## Connected Wallets: Async Compute + Larger Clusters

  The [Connected Wallets endpoint](/api-reference/wallet/cluster) now returns **either `200` or `202`** depending on cache state - clients must handle both.

  <Warning>
    **Behavior change.** Hub-wallet clusters can take 60–180 seconds to compute, far beyond any HTTP timeout. On a cache miss, stale cache (>24h), or `recompute=true`, the endpoint now returns `202 Accepted` with a `Retry-After` header and a `{status, retry_after_seconds, reason, message}` body. Background BFS runs out-of-band; the next call after `Retry-After` returns `200` from cache.
  </Warning>

  **`reason` values on 202:** `miss`, `stale`, `forced`, `another_pod_computing` (cross-pod Redis lock).

  **Other changes:**

  * `limit` upper bound bumped **200 → 1000**. Up to 1000 siblings persisted per seed.
  * Cluster cache TTL is now **24 hours**.
  * `min_hops` is now described as `1 = direct neighbor` (previously `0 = direct`).
  * Richer `evidence` documentation: `hops`, `bidirectional`, `direct_flow`, `shared_peers`, `same_signer`, `same_x_username`, `shared_first_funder`, `is_verified_trader`, `class`.

  See the [recommended client polling pattern](/api-reference/wallet/cluster#recommended-client-pattern) in the docs.
</Update>

<Update label="May 17, 2026" tags={["New", "Improvement"]}>
  ## Polymarket V2 Builder Analytics

  Four new endpoints exposing Polymarket V2 builder-attribution data - leaderboards, per-builder summaries, top markets per builder, and bucketed time-series.

  <CardGroup cols={2}>
    <Card title="Leaderboard" icon="trophy" href="/api-reference/builders/leaderboard">
      Ranked list of builders by attributed volume or fee revenue over 24h / 7d / 30d / all.
    </Card>

    <Card title="Builder Stats" icon="address-card" href="/api-reference/builders/builder-stats">
      Summary metrics for a single builder plus its full `(taker_bps, maker_bps)` rate history.
    </Card>

    <Card title="Builder Markets" icon="list" href="/api-reference/builders/builder-markets">
      Top markets attributed to a builder, ranked by volume.
    </Card>

    <Card title="Builder Timeseries" icon="chart-area" href="/api-reference/builders/builder-timeseries">
      Bucketed (`day` or `hour`) volume and fee revenue for charting.
    </Card>
  </CardGroup>

  <Note>
    V2-only. V1 fills, the zero-sentinel builder, and reversed (`sign != 1`) rows are excluded. The leaderboard's `sort_by=fee` is useful when looking at revenue-earning builders, since the highest-volume builders often charge 0 bps.
  </Note>

  ## List Markets: `end_after` / `end_before` Filters

  [`GET /v2/polymarket/markets`](/api-reference/markets/list-markets) now accepts two new optional Unix-timestamp (seconds) query parameters - `end_after` and `end_before` - to filter markets by `end_time`. Useful for listing markets that close in a specific window (e.g. "this week's resolutions").
</Update>

<Update label="May 9, 2026" tags={["New", "Improvement"]}>
  ## Cross-Platform Matching: Predict and Opinion Support

  [Find Matching Markets](/api-reference/matching/find-matches) and [Get Matched Pairs](/api-reference/matching/matched-pairs) now include Predict.fun and Opinion canonical equivalents alongside Polymarket, Kalshi, and Limitless.

  **Changes:**

  * `/v2/matching-markets`: accepts Predict and Opinion identifiers (`market_id`, `condition_id`, or `token_id`) and returns exact canonical equivalents when available.
  * `/v2/matching-markets/pairs`: returns `PREDICT` and `OPINION` venue blocks by default when canonical equivalents exist.
  * `venue` filtering now supports `polymarket`, `kalshi`, `limitless`, `predict`, and `opinion`.

  <Note>
    Predict.fun and Opinion matching is powered by the canonical matching graph. Existing Polymarket, Kalshi, and Limitless response fields remain backward-compatible.
  </Note>
</Update>

<Update label="May 7, 2026" tags={["New", "Performance"]}>
  ## Polymarket Markets: Keyset Pagination

  <Card title="New Endpoint: GET /v2/polymarket/markets/keyset" icon="list">
    List Polymarket markets with the same filters and sort options as `/v2/polymarket/markets`, but use cursor-based `pagination_key` instead of `offset`.
  </Card>

  Use [List Markets (Keyset Pagination)](/api-reference/markets/list-markets) for large backfills and deep pagination. The existing offset endpoint remains unchanged.

  ## Polymarket Events: Keyset Pagination

  <Card title="New Endpoint: GET /v2/polymarket/events/keyset" icon="calendar">
    List Polymarket events with the same filters and sort options as `/v2/polymarket/events`, but use cursor-based `pagination_key` instead of `offset`.
  </Card>

  Use [List Events (Keyset Pagination)](/api-reference/markets/events) for large event crawls. The existing offset endpoint remains unchanged.
</Update>

<Update label="May 7, 2026" tags={["Fix", "Data Quality"]}>
  ## Limitless: CLOB Open Interest

  Limitless CLOB markets now return `open_interest_usd: null` instead of `0` because Limitless does not currently expose CLOB open interest through the indexed market API. AMM market open interest remains available.

  See [Limitless Markets](/api-reference/limitless/markets) for the field note.
</Update>

<Update label="May 5, 2026" tags={["New"]}>
  ## Trading API: Hyperliquid (HIP-4) Support

  <Card title="New Venue: Hyperliquid" icon="bolt">
    Trade Hyperliquid HIP-4 prediction markets through the Predexon Trading API. Limit and market orders, full position lifecycle, and managed wallet provisioning - same shape as Polymarket, Predict, Opinion, and Limitless.
  </Card>

  **Trading**

  * New `venue: "hyperliquid"` accepted on every `/api/accounts/*` endpoint (place order, cancel, positions, balance, redeem, withdraw, enable).
  * Markets are identified by `assetId` in the `market` bag - a single integer that pins down a specific HIP-4 outcome side. See [Place Order](/trading-api/accounts/place-order) for the per-venue identification table.
  * \$10 minimum order notional (`size × price ≥ 10`) - applies to all orders. Smaller orders are rejected.
  * Market BUY takes `size` (not `amount`) - fills as many shares as possible at the best ask up to the requested quantity.

  **Funding**

  * Bridge USDC to your Hyperliquid wallet via [Across](https://across.to). Select Hyperliquid (HyperCore) as the destination chain. Funds arrive as USDH (HL's USDC-pegged stablecoin) in your trading balance in \~1-2 minutes; `/balance` returns `asset: "usdh"`.

  **Withdrawals**

  * Deliver USDC on Arbitrum to any address. **\$10 minimum withdrawal.** A **\$1 USDC fee** is deducted before delivery - recipient receives `amount - 1`. Settlement takes \~3-4 minutes.

  **Available now** for any API key. No allowlist - call `POST /api/accounts/{accountId}/enable {"venue": "hyperliquid"}` to provision a wallet.
</Update>

<Update label="April 30, 2026" tags={["New", "Improvement"]}>
  ## WebSocket: Crypto Prices Channel

  <Card title="New Channel: crypto_prices (Chainlink Data Streams)" icon="chart-line">
    Real-time crypto price ticks relayed from [Chainlink Data Streams](https://docs.chain.link/data-streams). Subscribe with `platform: "chainlink"`, `type: "crypto"` and a `feeds` filter - wildcard supported. See [Crypto Prices](/websocket/crypto-prices).
  </Card>

  **Supported feeds:** BTC/USD, ETH/USD, SOL/USD, XRP/USD, BNB/USD, DOGE/USD, HYPE/USD.

  ```json theme={null}
  {
    "action": "subscribe",
    "platform": "chainlink",
    "version": 1,
    "type": "crypto",
    "filters": { "feeds": ["BTC/USD", "ETH/USD"] }
  }
  ```

  Each tick is a `price_feed` event with `price`, `bid`, `ask`, and `observed_at` (Unix seconds). One event per upstream observation - no batching. Plan limits and wildcard rules are the same as the existing channels.

  ## WebSocket: Explicit `role` on order\_filled

  Every `order_filled` event on the [trades channel](/websocket/trades) now carries a `role` field - `"maker"` or `"taker"` - telling you which OrderFilled emission you're looking at:

  * `role: "maker"` - per-maker fill (one per maker matched in the tx). `taker` is the real taker user address. **This is what you want by default.**
  * `role: "taker"` - synthetic taker-aggregate emission (one per `matchOrders` tx, summing across all makers). `taker` equals the exchange contract address.

  <Warning>
    **Don't sum volume across both roles** - the taker-aggregate row covers the same shares as the per-maker rows. Filter on `role === "maker"` for maker-attribution counts, or `role === "taker"` for one-row-per-taker-action dashboards. Previously consumers had to derive this implicitly by checking `taker` against the five exchange contract addresses; now it's a first-class field.
  </Warning>

  The field is fully additive - existing clients ignore it unchanged.
</Update>

<Update label="April 30, 2026" tags={["New", "Improvement"]}>
  ## Connected Wallets Endpoint

  <Card title="New Endpoint: GET /v2/polymarket/wallet/{address}/cluster" icon="diagram-project">
    Discover sibling wallets behind a seed address via the on-chain transfer graph (USDC, pUSD, CTF) plus identity-proof signals - shared signer, shared X username, shared first funder. Each sibling carries a `confidence` score (0–100); the default `min_confidence=70` returns strong-evidence links only.
  </Card>

  Use this to surface likely-related accounts behind a single operator - alt wallets, hot/cold splits, multi-account farming patterns. Results are cached; pass `recompute=true` to force a fresh BFS. **Requires Dev or Pro tier.**

  ## Trades: V2 Exchange Fields

  Every row in the [`/v2/polymarket/trades`](/api-reference/trading/trades) response now carries Polymarket exchange version metadata:

  * `exchange_version` - `1` (V1 CTF/NegRiskCTF) or `2` (V2).
  * `builder` - V2 builder attribution tag (bytes32 hex). Empty for V1 fills or V2 fills with no builder.
  * `metadata` - V2 opaque metadata tag (bytes32 hex). Empty for V1 fills or V2 fills with no metadata.

  The endpoint also accepts a new `builder` query parameter to filter fills attributed to a specific builder tag.
</Update>

<Update label="April 25, 2026" tags={["New", "Improvement"]}>
  ## Cross-Platform Matching: Limitless Support

  [Find Matching Markets](/api-reference/matching/find-matches) and [Get Matched Pairs](/api-reference/matching/matched-pairs) now cover Limitless alongside Polymarket and Kalshi.

  **Changes:**

  * `/v2/matching-markets`: new `limitless_slug` query param - pass a Limitless slug to find equivalent markets on Polymarket or Kalshi.
  * `/v2/matching-markets/pairs`: new `venue` filter - restrict results to a specific venue pairing.
  * `MatchedPair` schema: `kalshi` block is now **optional**, and a new optional `limitless` block (using `LimitlessPairInfo`) is included when a Limitless equivalent exists.

  <Note>
    Existing clients reading `pair.kalshi` directly should null-check before access - pairs without a Kalshi equivalent will omit the field.
  </Note>
</Update>

<Update label="April 24, 2026" tags={["New", "Improvement"]}>
  ## Per-Token Candlesticks

  <Card title="New Endpoint: GET /v2/polymarket/candlesticks/token/{token_id}" icon="chart-candlestick">
    Fetch raw OHLCV candles for a single outcome token. Unlike the [condition-level endpoint](/api-reference/markets/candlesticks), prices are **not** normalized - NO-token prices stay as NO prices, and volume reflects only that token's trades.
  </Card>

  Use this when you need to chart each side of a binary market separately, or when you only have a token ID. Same intervals, same auto mode, same response shape - the response now also includes a top-level `token_id` (and `condition_id` becomes optional, set only on the condition-level endpoint).

  ## Activity: `CONVERT` Events + NegRisk Fields

  The activity endpoint now returns `CONVERT` events alongside `SPLIT`, `MERGE`, and `REDEEM` - these are NegRisk position conversions (sell NO on a subset of conditions, buy YES on the remainder).

  **New fields on the `Activity` schema:**

  * `neg_risk_market_id` - NegRisk parent market identifier (32-byte hex, matches Gamma's `Event.negRiskMarketID`). Populated only on `CONVERT` rows.
  * `index_set` - NegRisk indexSet bitmask (decimal string) of which outcomes were involved. Populated only on `CONVERT` rows.
  * `market_id` is now nullable - it's `null` on `CONVERT` rows.

  <Warning>
    On `CONVERT` rows, `condition_id` is an **empty string** and `market_id` is `null` - filtering by either will not match conversion rows. Use `neg_risk_market_id` instead. Conversions are a market-level operation, not a per-outcome one.
  </Warning>
</Update>

<Update label="April 21, 2026" tags={["New", "Improvement"]}>
  ## WebSocket: Conversion Events & Pending Trade Gating

  **New `conversion` event type on the activity channel**

  V2 NegRisk "No" position conversions are now streamed as a new `conversion` event on the activity channel. Includes `neg_risk_event_id` (NegRiskAdapter marketId) and `index_set` (uint256 bitmap of converted question indices). See [Activity Events](/websocket/activity#conversion).

  <Note>
    **Two things to be aware of - neither affects most clients:**

    * `ActivityAlert.condition_id` is `null` only for the new `conversion` event type. Clients with strict typed generators (`condition_id: string`) should widen to `string | null` if they want to consume conversion events. Clients that filter by `event_type` in `{"split", "merge", "redeem"}` are unaffected.
    * Pending trade events (`filters.status: "all"` or `"pending"`) are now gated to **Dev+** plans. Free-tier clients that don't request pending (default `"confirmed"`) continue to work unchanged.
  </Note>
</Update>

<Update label="April 20, 2026" tags={["Improvement"]}>
  ## WebSocket: Token IDs on `condition_prepared`

  The `condition_prepared` lifecycle event now includes derived token IDs for binary markets (`outcome_slot_count === 2`) in the `tokens` array. Previously clients had to query Gamma or CLOB after receiving the event - now token IDs are available immediately from the WebSocket payload.

  * Binary markets: `tokens: [{ token_id, label: "Yes" }, { token_id, label: "No" }]` - derived from `condition_id` + `is_neg_risk` using the CTF Gnosis formula.
  * Non-binary markets: `tokens: null` (unchanged).
  * **Labels are placeholders** - resolve canonical outcome labels from Gamma/CLOB if needed.
</Update>

<Update label="April 19, 2026" tags={["New", "Improvement"]}>
  ## WebSocket: Polymarket V2 Support

  The WebSocket service now handles Polymarket V2 contracts alongside V1. **Fully backwards-compatible** - existing clients require zero code changes. See the [V2 Migration Guide](/websocket/v2-migration) for details.

  **Additive changes:**

  * New `version` field (`1` or `2`) on trade, activity, and lifecycle events
  * New `builder` and `metadata` fields on V2 `order_filled` events
  * New `collateral` channel for pUSD deposit/withdrawal events (`polyusd_wrapped` / `polyusd_unwrapped`)
  * New `condition_prepared` event type on the lifecycle channel (covers V1 + V2 market creation)

  <Warning>
    **Breaking for token discovery:** V2 exchanges no longer emit `TokenRegistered`. Clients using `token_registered` as a "new market" signal should switch to `condition_prepared` to cover both V1 and V2 markets.
  </Warning>
</Update>

<Update label="April 12, 2026" tags={["Improvement"]}>
  ## Candlesticks: New Intervals & Auto Mode

  The candlestick endpoint now supports **5-minute** and **15-minute** intervals, plus an **auto** mode (`interval=0`) that picks the best interval based on your time range. Auto is now the default.

  The response also includes `first_trade_ts` and `last_trade_ts` fields - the timestamps of the first and last trades in the market.

  | Interval | Value         | Max Range               |
  | -------- | ------------- | ----------------------- |
  | Auto     | `0` (default) | Best fit for your range |
  | 1m       | `1`           | 7 days                  |
  | 5m       | `5`           | 7 days                  |
  | 15m      | `15`          | 30 days                 |
  | 1h       | `60`          | 30 days                 |
  | 1d       | `1440`        | Unlimited (all-time)    |
</Update>

<Update label="April 7, 2026" tags={["Improvement"]}>
  ## Universal Predexon IDs on All List Market Endpoints

  `predexon_id` is now included in outcome objects across all five list market endpoints: Polymarket, Kalshi, Opinion, Limitless, and Predict.Fun. All five endpoints also support a `predexon_id` query parameter to filter markets by outcome ID.

  A Predexon ID is a stable, deterministic identifier for each tradeable outcome (`px-` followed by a 12-character base32 hash), consistent across all venues.
</Update>

<Update label="April 6, 2026" tags={["New", "Deprecated", "Improvement"]}>
  ## Wallet Positions: Per-Position Net Fees

  <Card title="New Field: net_fees_usd" icon="receipt">
    The `PositionDetails` schema now includes `net_fees_usd` - net taker fees charged for each individual position (charged minus refunded, in USD). Previously, fee data was only available at the wallet summary level.
  </Card>

  ## `fees_refunded` Deprecated

  The `fees_refunded` field now always returns `0` across all schemas. Refunds are already netted into `fees_paid`, making the separate field redundant.

  <Accordion title="Affected schemas">
    | Schema              | Field                                      |
    | ------------------- | ------------------------------------------ |
    | `PositionsSummary`  | `fees_refunded`                            |
    | `AllTimeMetrics`    | `fees_refunded`                            |
    | `WindowMetrics`     | `fees_refunded`                            |
    | `CohortStats`       | `avg_fees_refunded`, `total_fees_refunded` |
    | `WalletPnLResponse` | `fees_refunded`                            |
  </Accordion>

  ## Candlesticks: All-Time Range for Daily Interval

  The `1d` candlestick interval no longer has a range limit. Omit `start_time` and `end_time` to fetch the full history.

  | Interval | Max Range                |
  | -------- | ------------------------ |
  | `1m`     | 7 days                   |
  | `1h`     | 30 days                  |
  | `1d`     | **Unlimited (all-time)** |
</Update>

<Update label="April 4, 2026" tags={["New"]}>
  ## WebSocket: Oracle Channel

  <Card title="New Channel: oracle" icon="eye">
    Real-time UMA oracle resolution events for Polymarket markets - proposals, settlements, disputes, and resets.
  </Card>

  * Subscribe by `condition_ids` or `market_slugs`. Wildcard (`["*"]`) supported.
  * Event types: `proposal`, `settled`, `dispute`, `reset`.
  * Enrichment fields: `title`, `market_slug`, `image`, `outcomes`, `tokens`, `is_neg_risk`.
</Update>

<Update label="April 3, 2026" tags={["New"]}>
  ## WebSocket: Orderbook Channel

  <Card title="New Channel: orderbook" icon="book-open">
    Real-time L2 orderbook data from Polymarket's CLOB - snapshots, price changes, and last trades.
  </Card>

  * Subscribe by `token_ids`, `condition_ids`, or `market_slugs`. Wildcard (`["*"]`) supported.
  * Targeted subscriptions deliver individual events. Wildcard delivers 250ms batched events with price-level conflation.
  * Event types: `book_snapshot`, `price_change`, `last_trade`, `tick_size_change`, `snapshots_done`, `event_batch`, `resync`.
</Update>

<Update label="March 28, 2026" tags={["New"]}>
  ## New Endpoints: Opinion, Limitless, Predict.Fun Markets

  <CardGroup cols={3}>
    <Card title="Opinion" icon="comment-dots" href="/api-reference/opinion/markets">
      List Opinion markets with filtering, sorting, and event grouping.
    </Card>

    <Card title="Limitless" icon="infinity" href="/api-reference/limitless/markets">
      List Limitless markets with filtering, sorting, and trade type filter.
    </Card>

    <Card title="Predict.Fun" icon="crystal-ball" href="/api-reference/predictfun/markets">
      List Predict.Fun markets with filtering, sorting, and event grouping.
    </Card>
  </CardGroup>

  All three support status filtering, text search, cursor pagination, and platform-specific filters.
</Update>

<Update label="March 23, 2026" tags={["Improvement"]}>
  ## Smart Activity: Market Status Filter

  `GET /v2/polymarket/markets/smart-activity` now supports an optional `status` query parameter.

  | Value       | Description                     |
  | ----------- | ------------------------------- |
  | `open`      | Currently tradable markets only |
  | `closed`    | Resolved/settled markets only   |
  | *(omitted)* | All markets (default)           |
</Update>

<Update label="March 15, 2026" tags={["New"]}>
  ## New Endpoints: Cross-Platform Orderbooks

  <CardGroup cols={3}>
    <Card title="Limitless" icon="infinity" href="/api-reference/limitless/orderbooks">
      Historical orderbook snapshots for Limitless.
    </Card>

    <Card title="Opinion" icon="comment-dots" href="/api-reference/opinion/orderbooks">
      Historical orderbook snapshots for Opinion.
    </Card>

    <Card title="Predict.Fun" icon="crystal-ball" href="/api-reference/predictfun/orderbooks">
      Historical orderbook snapshots for Predict.Fun.
    </Card>
  </CardGroup>

  All return YES-side orderbook data with cursor pagination. Timestamps in milliseconds.

  <Warning>
    **Kalshi data gap:** Orderbook data unavailable between **March 12 08:00 UTC** and **March 14 18:10 UTC** due to an upstream API format change.
  </Warning>
</Update>

<Update label="March 7, 2026" tags={["New"]}>
  ## WebSocket: Pending Trades Channel

  <Card title="New Channel: pending-trades" icon="clock" href="/websocket/pending-trades">
    Detect trade events from the Polygon mempool **3–5 seconds before** on-chain confirmation.
  </Card>
</Update>

<Update label="February 20, 2026" tags={["Improvement"]}>
  ## WebSocket: New Trade Event Fields

  The `order_filled` event on the trades channel now includes four new fields:

  | Field                    | Type            | Description                                                     |
  | ------------------------ | --------------- | --------------------------------------------------------------- |
  | `outcome_index`          | number \| null  | `0` = first outcome (Yes/Over/Up), `1` = second (No/Under/Down) |
  | `complement_token_id`    | string \| null  | Token ID of the opposite outcome                                |
  | `complement_token_label` | string \| null  | Label of the opposite outcome                                   |
  | `is_neg_risk`            | boolean \| null | `true` for neg-risk markets                                     |

  All fields are additive and nullable - existing clients are unaffected.
</Update>

<Update label="February 18, 2026" tags={["Improvement"]}>
  ## List Markets: Token ID Filter

  `GET /v2/polymarket/markets` now supports a `token_id` query parameter (up to 50 IDs).

  ## Crypto Up/Down: 5-Minute Timeframe

  `GET /v2/polymarket/crypto-updown` now supports `5m` as a timeframe filter.
</Update>

<Update label="February 17, 2026" tags={["New"]}>
  ## New Endpoint: Batch Wallet Profiles

  <Card title="Batch Wallet Profiles" icon="users" href="/api-reference/wallet/wallet-profiles-batch">
    `GET /v2/polymarket/wallets/profiles` - fetch up to 20 wallet profiles in a single request via comma-separated `addresses`.
  </Card>
</Update>

<Update label="February 10, 2026" tags={["New", "Improvement"]}>
  ## Total PnL & Rolling Window Metrics

  <Card title="Total PnL" icon="chart-line">
    Total PnL (`realized + unrealized - net fees`) is now available across all analytics, leaderboard, smart money, and wallet endpoints.
  </Card>

  <Warning>
    **Rolling total PnL accuracy timeline:**

    * **All-time**: accurate immediately (February 10, 2026)
    * **1-day rolling**: fully accurate February 11, 2026
    * **7-day rolling**: fully accurate February 17, 2026
    * **30-day rolling**: fully accurate March 12, 2026
  </Warning>

  <Accordion title="New filter parameters">
    | Endpoint                                               | New Parameters                                                                                                                                           |
    | ------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------- |
    | `GET /v2/polymarket/leaderboard`                       | `min_total_pnl`, `max_total_pnl`, `max_volume`, `max_trades`, `max_roi`, `max_profit_factor`, `max_win_rate`, `max_avg_trade_usd`, `max_wallet_age_days` |
    | `GET /v2/polymarket/leaderboard/market/{condition_id}` | `min_total_pnl`, `max_total_pnl`, `max_trades`, `max_volume`                                                                                             |
    | `GET /v2/polymarket/wallets/filter`                    | `min_total_pnl`, `max_total_pnl`                                                                                                                         |
    | `GET /v2/polymarket/markets/smart-activity`            | `min_total_pnl`                                                                                                                                          |
    | `GET /v2/polymarket/market/{condition_id}/smart-money` | `min_total_pnl`                                                                                                                                          |
  </Accordion>

  <Accordion title="Schema changes">
    | Schema                         | Change                                                                       |
    | ------------------------------ | ---------------------------------------------------------------------------- |
    | `WindowMetrics`                | Added `total_pnl` field                                                      |
    | `LeaderboardEntry`             | Added `total_pnl` and `first_trade_at`; `total_pnl` available as sort option |
    | `SmartActivityMarket`          | Added `smart_total_pnl`; available as sort option                            |
    | `SmartMoneyPositioning`        | Added `total_smart_total_pnl`                                                |
    | `GET /v2/polymarket/positions` | Default sort changed from `desc` to `asc`                                    |
  </Accordion>
</Update>

<Update label="February 8, 2026" tags={["New"]}>
  ## New Endpoints

  <CardGroup cols={3}>
    <Card title="Bulk Positions" icon="layer-group" href="/api-reference/trading/positions">
      Bulk position fetching with block/timestamp filtering and cursor pagination.
    </Card>

    <Card title="Wallet Volume Chart" icon="chart-bar" href="/api-reference/wallet/volume-chart">
      Per-wallet volume chart with BUY/SELL breakdown by period.
    </Card>

    <Card title="Top Holders" icon="ranking-star" href="/api-reference/analytics/top-holders">
      Top holders for a market ranked by position size.
    </Card>
  </CardGroup>

  <Accordion title="Schema changes">
    | Schema                                      | Change                                             |
    | ------------------------------------------- | -------------------------------------------------- |
    | `GET /v2/polymarket/markets/smart-activity` | `min_realized_pnl` threshold increased \$1K → \$5K |
    | `GET /v2/binance/candles/{symbol}`          | `start_time` and `end_time` now optional           |
    | `PositionDetails`                           | Added `total_shares_bought` field                  |
    | `WalletProfileResponse`                     | Added `total_pnl` and `unrealized_pnl` fields      |
  </Accordion>
</Update>

<Update label="February 4, 2026" tags={["New", "Breaking Change"]}>
  ## API v2 Launch

  <Card title="API v2" icon="rocket">
    14 new endpoints, improved pagination, and expanded analytics. v1 remains fully supported.
  </Card>

  **Base path:** `/v2/` (e.g., `https://api.predexon.com/v2/polymarket/markets`)

  <CardGroup cols={2}>
    <Card title="Binance Data" icon="chart-candlestick">
      Real-time and historical Binance book ticker data for backtesting crypto up/down markets.
    </Card>

    <Card title="Smart Money Analytics" icon="brain">
      Track where profitable wallets are trading, filter by PnL/win rate, and discover alpha.
    </Card>

    <Card title="Wallet Intelligence" icon="wallet">
      Full wallet profiles, trading style classification, market exposure, and similar wallet discovery.
    </Card>

    <Card title="Enhanced Market Data" icon="chart-line">
      Events grouping, crypto up/down markets, and per-period volume charts.
    </Card>
  </CardGroup>

  <Accordion title="All new endpoints">
    | Category    | Endpoint                                               | Description                                            |
    | ----------- | ------------------------------------------------------ | ------------------------------------------------------ |
    | Binance     | `GET /v2/binance/ticks/{symbol}`                       | Raw book ticker data at microsecond granularity        |
    | Binance     | `GET /v2/binance/candles/{symbol}`                     | OHLCV candles from book ticker mid-prices (1s–1d)      |
    | Smart Money | `GET /v2/polymarket/markets/smart-activity`            | Markets ranked by smart wallet activity                |
    | Smart Money | `GET /v2/polymarket/market/{condition_id}/smart-money` | Smart money positioning for a market                   |
    | Analytics   | `GET /v2/polymarket/leaderboard`                       | Global wallet leaderboard (22 filter/sort params)      |
    | Analytics   | `GET /v2/polymarket/leaderboard/market/{condition_id}` | Per-market leaderboard                                 |
    | Analytics   | `GET /v2/polymarket/cohorts/stats`                     | Aggregate stats for wallet cohorts                     |
    | Analytics   | `GET /v2/polymarket/wallets/filter`                    | Filter wallets by market participation and performance |
    | Wallets     | `GET /v2/polymarket/wallet/{wallet}`                   | Full wallet profile with metrics across all windows    |
    | Wallets     | `GET /v2/polymarket/wallet/{wallet}/markets`           | Markets a wallet has traded                            |
    | Wallets     | `GET /v2/polymarket/wallet/{wallet}/similar`           | Find wallets with similar trading patterns             |
    | Markets     | `GET /v2/polymarket/events`                            | List events with grouped markets                       |
    | Markets     | `GET /v2/polymarket/crypto-updown`                     | Crypto up/down prediction markets                      |
    | Markets     | `GET /v2/polymarket/volume-chart/{condition_id}`       | Per-period volume breakdown                            |
  </Accordion>

  <Accordion title="WebSocket updates">
    **Fee refund events** - the trades channel now delivers `order_filled` and `fee_refund` event types. Correlate refunds to trades via `order_hash`.

    **Plan tiers restructured** (Free/Pro/Desk → Free/Dev/Pro/Enterprise):

    | Limit                      | Free | Dev | Pro         | Enterprise |
    | -------------------------- | ---- | --- | ----------- | ---------- |
    | WebSocket access           | No   | Yes | Yes         | Yes        |
    | Subscriptions / connection | -    | 10  | 100         | Custom     |
    | Items / subscription       | -    | 10  | 500         | Custom     |
    | Total items                | -    | 100 | 50,000      | Custom     |
    | Wildcard                   | -    | No  | 2 / channel | Yes        |
    | Priority routing           | -    | No  | No          | Yes        |

    **Wildcard rules:** tracked per-channel, cannot mix wildcard and regular subs on same channel, Pro allows 2 wildcard connections per channel.

    **Filter restrictions:** `market_slugs` only on trades channel, `users` not on lifecycle channel. All channels support `condition_ids` and `["*"]`.

    **New error code:** `RATE_LIMIT`. **Keepalive:** 30s ping, 60s pong timeout, 2min idle timeout, 1MB drop / 4MB disconnect buffer limits.
  </Accordion>

  <Accordion title="Breaking changes (v1 → v2)">
    <Warning>
      These changes only affect v2 endpoints. v1 endpoints remain unchanged.
    </Warning>

    **Path parameter renamed:** `{wallet_address}` → `{wallet}` on all wallet endpoints.

    **Pagination:** switched from `offset` to cursor-based `pagination_key`:

    | Endpoint                | Change                      |
    | ----------------------- | --------------------------- |
    | `/v2/polymarket/trades` | `offset` → `pagination_key` |
    | `/v2/dflow/trades`      | `offset` → `pagination_key` |
    | `/v2/kalshi/markets`    | `offset` → `pagination_key` |
    | `/v2/kalshi/trades`     | `offset` → `pagination_key` |

    **Parameter renames:** `user` → `wallet` on `/v2/polymarket/trades` and `/v2/polymarket/activity`.

    **Removed parameters:** `token_id` from `/v2/polymarket/markets` (use `condition_id`), `match_type` from `/v2/matching-markets/pairs`.
  </Accordion>

  <Accordion title="New filter parameters">
    | Endpoint                  | New Parameters                                                                                         |
    | ------------------------- | ------------------------------------------------------------------------------------------------------ |
    | `/v2/polymarket/markets`  | `min_volume_1d`, `min_volume_7d`, `min_volume_30d`, `min_trades_1d`, `min_trades_7d`, `min_trades_30d` |
    | `/v2/polymarket/trades`   | `min_total`, `wallet`                                                                                  |
    | `/v2/polymarket/activity` | `sort_by`, `wallet`                                                                                    |
  </Accordion>
</Update>

<Update label="January 19, 2026" tags={["Improvement"]}>
  ## Matching Markets: Enhanced Filtering

  New query parameters and response fields for cross-platform market matching.

  | Change              | Details                                                                                     |
  | ------------------- | ------------------------------------------------------------------------------------------- |
  | New query params    | `polymarket_condition_id`, `polymarket_market_id`, `match_type` (`exact`, `related`, `all`) |
  | New response fields | `condition_id`, `market_id` for Polymarket markets                                          |
  | Pairs endpoint      | Now includes `match_type` field per pair                                                    |
</Update>

<Update label="January 16, 2026" tags={["New"]}>
  ## Trading API

  <Card title="Trading API" icon="chart-line">
    Place orders, view positions, check balances, and redeem resolved positions on Polymarket and Kalshi.
  </Card>

  * `POST /api/users/{userId}/orders` - Place buy or sell orders
  * `GET /api/users/{userId}/positions` - Get current positions with PnL
  * `GET /api/users/{userId}/balance` - Get available balances
  * `POST /api/users/{userId}/redeem` - Redeem resolved positions
</Update>

<Update label="January 15, 2026" tags={["Improvement"]}>
  ## Schema Updates

  | Endpoint                                      | Change                                                                                                                                                                |
  | --------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
  | `/v1/kalshi/markets`                          | Added `yes_subtitle` and `no_subtitle` fields                                                                                                                         |
  | `/v1/dflow/wallet/positions/{wallet_address}` | Added `yes_subtitle`, `no_subtitle`, `market_title`, `outcome`, `status`, `total_cost_basis`, `total_qty_bought`, `total_qty_sold`, `first_trade_at`, `last_trade_at` |
</Update>

<Update label="January 13, 2026" tags={["New", "Breaking Change"]}>
  ## Dflow Support

  <Card title="New Platform: Dflow" icon="bolt">
    Three new endpoints for the Dflow prediction market platform.
  </Card>

  * `GET /v1/dflow/trades` - Trade history for a wallet
  * `GET /v1/dflow/wallet/positions/{wallet_address}` - Positions with cost basis and PnL
  * `GET /v1/dflow/wallet/pnl/{wallet_address}` - Realized PnL history

  ## Breaking Change: Candlesticks Response

  <Warning>
    The `/v1/polymarket/candlesticks/{condition_id}` response structure changed from nested `[data, metadata]` tuples to a flat structure:

    ```json theme={null}
    {
      "condition_id": "0x1234...",
      "candlesticks": [
        {
          "end_period_ts": 1704070800,
          "price": { "open": 0.55, "high": 0.57, ... },
          "volume": 125000.50,
          "trades_count": 847
        }
      ]
    }
    ```
  </Warning>

  Schema updates: `CandlestickData` now fully typed, `CandlesticksResponse` has `condition_id` field, new `PriceData` schema with dollar-formatted strings.
</Update>
