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.
Clusters
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
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).
Use expand=markets to add the catalog market object to every low and high leg:
title, venue, status, close time, image URL when stored, liquidity, and volume. The CSV
expand query parameter supports only markets today; any other value returns 400.
The expansion adds no extra metering weight.
Stored mode keeps its existing limit default of 20 and maximum of 100; this
documents pre-existing behavior rather than adding headroom. live=true now has an explicit
maximum of 10 because every live cluster recomputes against real order books. The tighter
cap bounds that cost; the old shared maximum of 100 was an accidental abuse vector on the live path.
Executable assessment
fetchArbitrage is router-only and assesses a bounded contract size against live asks:
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:
- By default, prices compared are each cluster member's stored Yes price from the catalog
snapshot;
live=trueinstead overlays current order-book mid-prices, and on some venues the book itself is reconstructed (synthetic: true) — indicative either way. - 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.