Skip to main content
GET
/
v2
/
matching-markets
/
pairs
Get Matched Pairs
curl --request GET \
  --url https://api.predexon.com/v2/matching-markets/pairs \
  --header 'x-api-key: <api-key>'
{
  "pairs": [
    {
      "POLYMARKET": {
        "condition_id": "<string>",
        "market_slug": "<string>",
        "market_id": "<string>",
        "title": "<string>",
        "expiration_ts": 123
      },
      "KALSHI": {
        "market_ticker": "<string>",
        "title": "<string>",
        "yes_subtitle": "<string>",
        "expiration_ts": 123
      },
      "similarity": 123,
      "explanation": "<string>",
      "earliest_expiration_ts": 123
    }
  ],
  "pagination": {
    "limit": 123,
    "count": 123,
    "has_more": true,
    "pagination_key": "<string>"
  }
}

Overview

Get all active exact-matched market pairs between Polymarket and Kalshi. This endpoint returns pre-computed pairs where both markets are currently active, ordered by similarity score (highest first).
Requires Dev or Pro tier. This endpoint is not available on the Free tier.
ConstraintValue
limit1–200 (default 100)
sort_bysimilarity (default), expiration
sort_orderasc, desc (default)
LLM-Based Matching: Market matching is powered by large language models (LLMs). There is a small percentage of markets where hallucinations may occur, resulting in invalid or incorrect matches. Always verify matches before making trading decisions.

Sorting

By default, pairs are sorted by similarity in descending order (highest first). You can change the sort field and direction:
  • sort_by=similarity (default) — Order by match confidence score
  • sort_by=expiration — Order by earliest_expiration_ts (the soonest expiration across both platforms). Pairs where both expirations are null are excluded when sorting by expiration.
Use sort_order=asc to reverse the direction (e.g., soonest-expiring first).

Expiration Filtering

Filter pairs by market expiration timestamps (unix seconds). These filters are useful for finding pairs that expire within a specific time window.
ParameterDescription
expires_beforeOnly pairs where earliest_expiration_ts is before this timestamp
expires_afterOnly pairs where earliest_expiration_ts is after this timestamp
k_expires_beforeOnly pairs where Kalshi expires before this timestamp
k_expires_afterOnly pairs where Kalshi expires after this timestamp
pm_expires_beforeOnly pairs where Polymarket expires before this timestamp
pm_expires_afterOnly pairs where Polymarket expires after this timestamp
Pairs where the relevant expiration field is null are excluded from results when using that filter. For example, using expires_before will exclude pairs where both platform expirations are null.

Response Fields

Each pair in the response now includes expiration timestamps:
FieldDescription
POLYMARKET.expiration_tsPolymarket market expiration (unix seconds), or null if unavailable
KALSHI.expiration_tsKalshi market expiration (unix seconds), or null if unavailable
earliest_expiration_tsThe earliest expiration across both platforms (unix seconds), or null if both are unavailable
Expiration timestamps are platform-provided estimates. These dates are set by Polymarket and Kalshi respectively and represent best-time estimates, not guaranteed resolution times. A market’s expiration passing does not necessarily mean it has resolved — resolution may occur later depending on the outcome and platform rules. Additionally, some markets may have a null expiration on one or both platforms if the platform does not provide an end date.

What is an “Exact” Match?

An exact match refers to market pairs that track the same real-world outcome and will resolve identically - when one resolves YES, the other will also resolve YES (and vice versa for NO). These are markets asking fundamentally the same question, even if the wording differs slightly between platforms.

Similarity Score Spectrum

All pairs returned by this endpoint have a similarity score of 95 or higher (on a 0-100 scale), which qualifies them as exact matches:
Score RangeClassificationDescription
98-100High confidenceVirtually identical markets with near-perfect semantic alignment.
96-97ConfidentStrong matches with minor wording variations. Reliable for most use cases.
95-96ThresholdMeets exact match criteria but may include edge cases with differences in resolution criteria.
For maximum accuracy: Filter with min_similarity=98 when precision is critical. The 95-97 range is generally reliable but may contain occasional false positives where resolution criteria have minor discrepancies.

Use Cases

Arbitrage Discovery

Find price discrepancies between identical markets on different platforms

Cross-Platform Analysis

Compare liquidity and volume across platforms for the same event

Market Coverage

Identify which markets exist on both platforms

Price Feeds

Build composite price feeds from multiple sources
By default, pairs are ordered by similarity score (highest first). Use sort_by=expiration&sort_order=asc to find soonest-expiring pairs, or min_similarity to filter for high-confidence matches only.

Authorizations

x-api-key
string
header
required

Query Parameters

active_only
boolean
default:true

Only return pairs where both markets are active

min_similarity
integer | null

Minimum similarity score (0-100)

Required range: 0 <= x <= 100
sort_by
enum<string>
default:similarity

Sort field: 'similarity' or 'expiration'

Available options:
similarity,
expiration
sort_order
enum<string>
default:desc

Sort direction: 'asc' or 'desc'

Available options:
asc,
desc
expires_after
integer | null

Filter: earliest expiration after this unix timestamp (seconds)

expires_before
integer | null

Filter: earliest expiration before this unix timestamp (seconds)

k_expires_after
integer | null

Filter: Kalshi expiration after this unix timestamp (seconds)

k_expires_before
integer | null

Filter: Kalshi expiration before this unix timestamp (seconds)

pm_expires_after
integer | null

Filter: Polymarket expiration after this unix timestamp (seconds)

pm_expires_before
integer | null

Filter: Polymarket expiration before this unix timestamp (seconds)

limit
integer
default:100

Maximum number of pairs to return

Required range: 1 <= x <= 200
pagination_key
string | null

Pagination key from previous response

Response

Successful Response

Response for matched pairs endpoint.

pairs
MatchedPair · object[]
required
pagination
CursorPagination · object
required

Cursor-based pagination for endpoints that don't support offset.