Skip to main content

1. Get an API key

Reach out at surface.surf to request access. You’ll receive a key in the format surf_....

2. Make a request

Pass your key in the X-API-Key header. You can look up either a Kalshi ticker or a Polymarket token ID.
curl https://surface.surf/api/v1/match/KXNBAGAME-26MAR02BOSMIL-BOS \
  -H "X-API-Key: YOUR_API_KEY"

3. Read the response

{
  "source": {
    "id": "KXNBAGAME-26MAR02BOSMIL-BOS",
    "exchange": "kalshi",
    "question": "Boston at Milwaukee Winner?",
    "url": "https://kalshi.com/markets/kxnbagame/kxnbagame-26mar02bosmil-bos"
  },
  "match": {
    "id": "98313749371896366519276790684273691434395213253249717099152745374401893722",
    "exchange": "polymarket",
    "question": "Celtics vs. Bucks",
    "url": "https://polymarket.com/event/celtics-vs-bucks"
  },
  "confidence": 0.99
}
source is the contract you queried. match is its cross-exchange counterpart. confidence is the match score — Surface only returns matches above 0.95.

It also works in reverse

Pass the Polymarket token ID to get the Kalshi side:
curl https://surface.surf/api/v1/match/98313749371896366519276790684273691434395213253249717099152745374401893722 \
  -H "X-API-Key: YOUR_API_KEY"

Check your quota

Every response includes two headers:
HeaderValue
X-Match-Limit-RemainingNew unique matches remaining today
X-Match-Limit-ResetNext reset (midnight UTC, RFC3339)
Repeat lookups of the same contract are always free and don’t appear in these counts. See Introduction for full quota rules.