matchwire Docs

Everything on one page: get started in five minutes, then the full API reference.

Introduction

matchwire returns one row per game, matched across Kalshi, Polymarket US, Polymarket International and Predict.fun. Each row keeps every venue's own market ID and a ready-made request for it. Mapping only: no prices or order books.

Using an AI? Copy this prompt into ChatGPT, Claude or any coding AI and it can build against matchwire for you.

Get a key

You get a key when you start a plan. Send it on every call as the x-api-key header. Your plan decides which venues and sports the key can read.

All calls go to https://api.matchwire.win with your key in the x-api-key header. Responses are JSON. Send Accept-Encoding: gzip for smaller responses.

First call

Ask for the games you want. This gets upcoming NFL games:

curl -H "x-api-key: YOUR_KEY" \
  "https://api.matchwire.win/api/v1/rows?sport=nfl&status=scheduled"

Narrow it more with comma lists: venue=kalshi,poly, type=winner,total, sport=nfl,baseball. The full filter list is in the reference.

Read a row

One row is one game. Each listing is that game on one venue, with the venue's own ID and a ready-made request you can call as-is. Real row, trimmed:

{
  "id": "ev:nfl:cleveland-browns:pittsburgh-steelers:2026-10-02",
  "sport": "nfl",
  "league": "NFL",
  "name": "Pittsburgh Steelers vs Cleveland Browns",
  "teams": ["Pittsburgh Steelers", "Cleveland Browns"],
  "start": "2026-10-02T00:15:00.000Z",
  "status": "scheduled",
  "listings": [
    {
      "venue": "kalshi",
      "marketId": "KXNFLGAME-26OCT01PITCLE-PIT",
      "type": "winner",
      "tier": "split-merge",
      "confidence": 1,
      "request": {
        "method": "GET",
        "url": "https://external-api.kalshi.com/trade-api/v2/markets/KXNFLGAME-26OCT01PITCLE-PIT"
      }
    },
    {
      "venue": "poly",
      "marketId": "aec-nfl-pit-cle-2026-10-01",
      "type": "winner",
      "tier": "exact",
      "confidence": 1,
      "request": {
        "method": "GET",
        "url": "https://gateway.polymarket.us/v1/market/slug/aec-nfl-pit-cle-2026-10-01"
      }
    },
    {
      "venue": "predictfun",
      "marketId": "1607342",
      "type": "winner",
      "tier": "exact",
      "confidence": 1,
      "request": {
        "method": "GET",
        "url": "https://api.predict.fun/v1/markets/1607342",
        "auth": "x-api-key"
      }
    }
  ],
  "markets": [ ... ],
  "notes": { "poly": "tie settles 0.50" },
  "seq": 2953883
}

Use id as your key for the game. markets groups every bet type (winner, totals, spreads) with its own per-venue listings, and the line is part of the match, so over 45.5 is never mixed with over 48.5.

Stay current

Every response carries a seq number. Save it, then ask only for what changed:

curl -H "x-api-key: YOUR_KEY" \
  "https://api.matchwire.win/api/v1/rows?sport=nfl&since=SEQ"

Changed games come back whole. Games that are gone come back as {"id": "...", "deleted": true}: remove them. Prefer a stream? GET /api/v1/push sends the same updates as they happen.

Make one full call, save the top-level seq, then poll /rows?since=SEQ and save each new seq. Changed games come back whole; removed games come back in tombstones as {"id": "...", "deleted": true}. When you filter by venue or type, a game that no longer matches your filter also comes back as deleted. Do not re-pull the full set on a timer.

Hand it to your AI

Paste this into ChatGPT, Claude or any coding AI, with your key in place of MY_KEY:

You have access to the matchwire API at https://api.matchwire.win.
Send header "x-api-key: MY_KEY" on every call.
It returns one row per game, matched across Kalshi, Polymarket US,
Polymarket International and Predict.fun. Rows hold mapping only, no prices.

1. First call: GET /api/v1/rows (add ?sport=, ?venue=, ?type= to narrow it).
   Save the "seq" number from the response.
2. After that, call GET /api/v1/rows?since=SEQ to get only what changed,
   then save the new "seq". Rows with "deleted": true are gone: remove them.
3. Use each row's "id" as the game's key. Never match games by title yourself.
4. Each listing has "request": call that URL as-is to reach the market on
   that venue. If it says "auth": "x-api-key", send my own key for that venue.
5. A 403 means the ask is outside my plan; the response says what is allowed.

Full reference: https://matchwire.win/docs/  and  https://matchwire.win/llms.txt

Before you integrate anything, explain in plain English what you plan to do, and ask me any questions you need so this works well. Then offer to demonstrate it by pulling one match for me and confirming it works.

Endpoints

CallWhat it returns
GET /api/v1/rowsEvery game your plan covers, one row per game.
GET /api/v1/rows?since=SEQOnly the games that changed since SEQ, plus deleted ones.
GET /api/v1/pushA live stream (Server-Sent Events) of the same updates. Add ?since=SEQ to resume.
GET /api/v1/sportsEvery sport name with its game counts. Use these names in sport=.
GET /api/v1/statusService status: last update and each venue's health.

Filters

Add any of these to /rows. Lists are comma separated; filters combine.

FilterExampleKeeps
sportsport=nfl,baseballGames in those sports. Names come from /api/v1/sports (baseball, not mlb).
venuevenue=kalshi,polyOnly those venues' listings. Games on none of them drop out.
typetype=winner,total,handicapOnly those bet types. Also: map_winner, score, event.
leagueleague=MLBGames in that league.
statusstatus=scheduledscheduled, live or ended.

Venue names: kalshi, poly (Polymarket US), polyintl (Polymarket International), predictfun. The live stream accepts sport, venue and type.

The row

FieldMeaning
idThe game's matchwire ID. The same on every venue; use it as your key.
sport, league, name, teamsWhat the game is.
startStart time, UTC.
statusscheduled, live or ended. Ended games are removed a day later.
listingsThe game-winner market on each venue.
marketsEvery matched bet type (winner, totals, spreads and more), each with its line and its own per-venue listings.
notesPer-venue rule differences worth knowing, e.g. how a tie settles.
seqWhen the row last changed. Pass the response's top-level seq back as since.

A listing

FieldMeaning
venueWhich venue.
marketIdThat venue's own ID for the market.
type / sideThe bet type, and which side this contract is (e.g. over) where the venue lists sides separately.
tier, confidenceHow the match was made, and how sure we are (0 to 1). Unsure matches are held back for review, never served as a guess.
requestThe exact call that venue answers for this market: method and url. Call it as-is. If it has auth: "x-api-key", send your own key for that venue.

matchwire serves mapping only: no prices or order books. Use request to read those from the venue itself.

Errors and limits

CodeMeaning
401Missing or wrong key.
403You asked for a venue or sport outside your plan. The response lists what is allowed.
429More than 60 requests this minute on that key. The retry-after header says how long to wait; the /api/v1/push stream is not limited.
truncated: trueMore than 5,000 rows matched. Add a filter to narrow it.

Agents: the MCP server is live at POST /mcp. Plans: pricing. Plain-text reference for AIs: llms.txt.