> ## Documentation index
> Fetch the complete documentation index at: https://docs.predictefy.com/llms.txt
> Use it to discover every available page before exploring further.

# Cross-venue data

> Matched market clusters across venues and indicative price discrepancies — honestly labeled.

The same real-world question often trades on several venues at once. Predictefy's
matching engine (embedding similarity + LLM validation) groups equivalent markets into
**clusters**, and computes **indicative price discrepancies** between cluster members.

:::note[Live, capability-qualified]
Clusters, indicative discrepancy endpoints, and the gate-enforcing `fetchArbitrage` endpoint
are live. A row earns the `arbitrage` label only when every live-depth, verified-fee,
open-market, positive-edge, and resolution-equivalence gate passes. Every other row remains
honestly labeled `indicative price discrepancy` with machine-readable reasons.
:::

## Clusters

```sh
curl -s "$PREDICTEFY_API_URL/v1/clusters?limit=20" \
  -H "Authorization: Bearer pk_live_YOUR_KEY"
```

- `GET /v1/clusters` — a page of cross-venue clusters.
- `GET /v1/clusters/:id` — one cluster with its per-venue member markets.

Cluster members carry a **`similarity`** score — the raw embedding similarity between
the matched markets. It is deliberately _not_ called "confidence": it is not a
calibrated probability that the markets are equivalent. Cluster ids are stable — they
do not change when a member market delists.

## Indicative price discrepancies

```sh
curl -s "$PREDICTEFY_API_URL/v1/discrepancies" \
  -H "Authorization: Bearer pk_live_YOUR_KEY"
```

Pass `?live=true` to recompute each discrepancy from **live order-book mids** instead
of the latest snapshot prices (the response's `meta.live` tells you which you got).

## Executable assessment

`fetchArbitrage` is router-only and assesses a bounded contract size against live asks:

```sh
curl -s "$PREDICTEFY_API_URL/api/router/fetchArbitrage?contracts=100&limit=5" \
  -H "Authorization: Bearer pk_live_YOUR_KEY"
```

Pass `executableOnly=true` to return only rows that passed every executable gate. The
default is more diagnostic: it also returns rejected candidates with per-leg and pair-level
reasons such as `synthetic_book`, `insufficient_depth`, `unverified_fees`,
`market_not_open`, or an equivalence conflict. Re-check the live result immediately before
acting because books, depth, and market status can change after the response.

## Why "indicative" — and never anything stronger

A price gap between two venues is only _tradeable_ if executable asks (not midpoints),
order-book depth at those prices, per-venue fees and gas, market open-status, and
**resolution equivalence** (the two markets truly settle on the same terms) all check
out — live, at execution time. The discrepancy endpoints do **not** apply those gates.

They tell you _where to look_, not _what to trade_:

- Prices compared are **mid-prices**, and on some venues the book itself is
  [reconstructed](/reference/venues/) (`synthetic: true`) — indicative by construction.
- Two markets in a cluster may resolve on subtly different terms.
- Fees, gas, spread, and depth routinely exceed a small headline gap.

Treat the output as a research signal and do your own verification. Existing
cross-match lookups cost **5 credits**; price-gap queries and cross-venue comparisons
cost **10 credits**.
