---
title: "Cross-Platform Prediction Market Matcher (Polymarket <> Kalshi)"
method: GET
path: "/gateway/v1/prediction-market/matching/pairs"
tags: ["Prediction Market"]
---

# Cross-Platform Prediction Market Matcher (Polymarket <> Kalshi)

`GET /gateway/v1/prediction-market/matching/pairs`

## Request

- Base URL: `https://api.asksurf.ai`
- URL: `https://api.asksurf.ai/gateway/v1/prediction-market/matching/pairs`
- Auth: HTTP bearer

Cross-platform prediction market pair matcher — finds the same event listed on both Polymarket and Kalshi, with live price spread data. This is prediction-market only (Polymarket and Kalshi). For crypto exchange markets, use `exchange-markets`.

Filter by category, match type, confidence score, or look up a specific market's cross-platform counterpart via `polymarket_condition_id` or `kalshi_market_ticker`.

Each pair includes current prices and spread percentage for arbitrage analysis. Sort by `spread_pct` to find the widest spreads.

**Data refresh:** ~5 minutes

## Query parameters

- `category` 'crypto' | 'culture' | 'economics' | 'financials' | 'politics' | 'stem' | 'sports': Filter by category
- `match_type` 'exact' | 'related': Filter by match type
- `active_only` boolean: Only return pairs where both markets are currently active
- `min_confidence` integer: Minimum confidence score (0-100)
- `polymarket_condition_id` string: Find match for this Polymarket market
- `kalshi_market_ticker` string: Find match for this Kalshi market
- `sort_by` 'confidence' | 'polymarket_volume' | 'kalshi_volume' | 'spread_pct': Sort field
- `order` 'asc' | 'desc': Sort order
- `limit` integer: Maximum rows to return
- `offset` integer: Pagination offset

## Response `200`

OK

- DataResponseMatchedMarketPair
  - `$schema` string, uri: A URL to the JSON Schema for this object.
  - `data` MatchedMarketPair[], nullable, required
    - `category` string, required: Market category
    - `confidence` integer, required: Match confidence score (75-100)
    - `kalshi` MatchedMarketKalshi, required
      - `event_ticker` string, required: Kalshi event ticker
      - `market_ticker` string, required: Kalshi market ticker
      - `open_interest` number, double, required: Open interest in contracts
      - `status` string, required: Market status
      - `title` string, required: Market title
      - `volume_contracts` number, double, required: Total volume in contracts
    - `kalshi_price` number, double: Kalshi YES-side probability (0-1). Omitted when no realtime price is available.
    - `match_type` string, required: Match type: exact or related
    - `polymarket` MatchedMarketPolymarket, required
      - `condition_id` string, required: Polymarket condition identifier
      - `event_slug` string, required: Event slug identifier
      - `is_active` boolean, required: Whether the market is currently active
      - `outcome_label` string: Polymarket matched outcome label
      - `question` string, required: Market question text
      - `token_id` string: Polymarket matched outcome token ID
      - `volume_usd` number, double, required: Total trading volume (USD)
    - `polymarket_price` number, double: Polymarket matched outcome probability (0-1). Omitted when no realtime price is available.
    - `spread_pct` number, double: Absolute spread between Polymarket matched-outcome and Kalshi YES probabilities, expressed as a percentage. Only present when both prices are known.
  - `meta` OffsetMeta, required
    - `cached` boolean, required: Whether this response was served from cache
    - `credits_used` integer, required: Credits deducted for this request
    - `empty_reason` string: Hint explaining why the data array is empty, when applicable
    - `has_more` boolean: Whether more items may exist beyond this response. For offset-paged endpoints, continue with a larger offset. For time-series endpoints without offset/cursor controls, true means the requested time range hit an upstream cap; narrow from/to to continue. Omitted when exhaustion cannot be proven.
    - `limit` integer, required: Maximum number of items returned in this response
    - `offset` integer, required: Number of items skipped (pagination offset)
    - `total` integer: Total number of matching items (before pagination). Omitted when total is unknown.
    - `watermark` integer: Warehouse watermark (Unix seconds) this response was computed at, on warehouse-backed endpoints (e.g. Hyperliquid /trades/aggregate) — rows up to this time come from the warehouse, newer rows from the live tail. Omitted elsewhere.

## Other responses

- `default`: Error

---

[API](https://skmtc.dev/asksurf/apis/asksurf-public-rest-api.md) - [All operations](https://skmtc.dev/asksurf/apis/asksurf-public-rest-api/llms.txt) - [OpenAPI document](https://skmtc.dev/asksurf/apis/asksurf-public-rest-api/revisions/91774fdd5302?raw)
