matchwire.win — Mapped Prediction Markets (Kalshi, Polymarket, Predict.fun)

win.matchwirev0.1.0更新於 Sep 30, 2026

One row per game, matched across Kalshi, Polymarket US/Intl and Predict.fun. Mapping only.

已驗證Streamable HTTP可網頁執行FinanceData & Analytics

概覽

AI 產生的概覽

讓助理查詢在 Kalshi、Polymarket 美國/國際站與 Predict.fun 之間已對應的預測市場賽事,每場比賽回傳一列並保留各平台自己的市場 id。

功能
透過遠端 MCP 端點提供唯讀工具:list_sports、find_rows、get_row、get_venue_market、report_issue 與 service_status。結果以每場比賽一列回傳,包含各平台的掛單資訊,每筆帶有該平台自己的 market id、比對層級(exact、normalized、fuzzy)、信心值,以及從該平台讀取該市場的請求。勝者、讓分、總分與特殊投注等市場類型也會比對,盤口線是比對的一部分。HTTP API 另支援增量更新與 SSE 串流推送。
適用情境
當助理需要判斷某個預測平台上的市場與另一個平台上的同一場比賽如何對應時適用,例如把 Kalshi 的市場與其 Polymarket 對應市場相比較。它只是對應層,價格與訂單簿仍需用你既有的資料來源從各平台讀取。
執行需求
遠端 streamable HTTP 端點 x-api-key 標頭,值為 matchwire.win API 金鑰(mw_...),從服務商定價頁取得;方案每月 99 美元起,Starter 提供 14 天試用。結果會依金鑰所屬方案範圍裁剪。
安裝前請注意
x-api-key 標頭是付費憑證,必須保密;所有工具結果都受金鑰方案限制,方案外的運動項目或平台會回傳方案錯誤。此服務為唯讀,回傳對應資料而非價格,因此不會透過它下單交易。速率限制(429)與金鑰無效或撤銷(401)會以具型別的錯誤回傳。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 matchwire.win — Mapped Prediction Markets (Kalshi, Polymarket, Predict.fun),將其新增到工作區。
  2. 為需要使用其工具的對話啟用該服務。

Web executable,透過 Streamable HTTP。 遠端服務在工作區中設定後即可從網頁執行環境執行。

其他 MCP 客戶端

把它新增到你客戶端的 mcpServers 設定中。

{
  "mcpServers": {
    "mapping": {
      "type": "http",
      "url": "https://api.matchwire.win/mcp"
    }
  }
}

README

[matchwire.win]

matchwire.win

Mapped prediction-market data for Node.js and Python. One client, no dependencies: matchwire.win returns one row per game, matched across Kalshi, Polymarket US, Polymarket International and Predict.fun, with each venue's own market id left intact — the pieces you need to compare a Kalshi API market with its Polymarket API twin without owning a reconciliation job.

Market types are matched too: winners, spreads and handicaps, totals and props. The line is part of the match, so over 45.5 is never confused with over 48.5.

Mapping only — no prices, no order books. Prices come from each venue; this library tells you which market on which venue is the same game.

js
import { Matchwire } from 'matchwire.win';
const mw = new Matchwire({ apiKey: process.env.MATCHWIRE_API_KEY });
const { rows, seq } = await mw.rows({ sport: 'nfl', venue: ['kalshi', 'poly'] });const game = rows.find((r) => r.listings.length > 1);console.log(game.name, game.listings.map((l) => `${l.venue}:${l.marketId}`));
  • Zero dependencies. One src/ directory on the global fetch. Nothing installs alongside it.
  • Node.js 18+, ESM and CommonJS, hand-written TypeScript declarations.
  • Typed errors — a 429 is distinguishable from a 401 invalid_key in code, not by string matching.
  • Deltas and streaming — since=<seq> for changed rows and tombstones, or the same updates over SSE.
  • MCP included — the same tools an AI agent gets from https://api.matchwire.win/mcp.
  • MIT licensed.

Install

bash
npm install matchwire.win      # Node.js — zero dependenciespip install matchwire.win      # Python 3.9+ — standard library only

Get a key at matchwire.win — plans start at $99/month with a 14-day trial on Starter.

Quickstart

Save as quickstart.mjs and run node quickstart.mjs (Needs MATCHWIRE_API_KEY in the environment):

js
import { Matchwire } from 'matchwire.win';
const mw = new Matchwire({ apiKey: process.env.MATCHWIRE_API_KEY });
const status = await mw.status();console.log(`${status.store.events} games, ${status.store.bound} bound listings`);
const { sports } = await mw.sports();console.log(sports.slice(0, 5).map((s) => `${s.sport} ${s.events}`));
const { rows } = await mw.rows({ sport: 'nfl', limit: 3 });for (const row of rows) {  console.log(row.name, row.status, row.listings.map((l) => l.venue).join('+'));}

The repository ships the same thing with formatting and error handling: node examples/quickstart.mjs.

API

MethodEndpointReturns
status()GET /api/v1/statusService and per-venue health, current seq, coverage counts
sports()GET /api/v1/sportsSports with game counts, plus group ids (esports, american-football, …)
rows(params)GET /api/v1/rowsOne row per game with its per-venue listings
row(id)MCP get_rowOne game by its mapped id
stream(params)GET /api/v1/pushThe same updates as Server-Sent Events
callTool(name, args)POST /mcpAny tool the MCP endpoint advertises
tools()POST /mcpThe tool list the endpoint advertises

Filters

sport, venue, type, league, status accept a value or a comma list; they combine. since=<seq> switches to a delta (changed rows plus tombstones).

  • venue= kalshi · poly (Polymarket US) · polyintl (Polymarket International) · predictfun
  • type= winner · total · handicap · map_winner · score · event
  • status= scheduled · live · ended
  • sport= a sport name (baseball, not mlb) or a group id from sports()
js
// Everything that changed since the last call, plus tombstones for pruned games.let seq = 0;const first = await mw.rows({ sport: 'esports', limit: 5000 });seq = first.seq;
const delta = await mw.rows({ since: seq });console.log(delta.rows.length, 'changed', delta.tombstones?.length ?? 0, 'gone');
// Stream instead of polling.for await (const frame of mw.stream({ since: seq })) {  console.log(frame.event, frame.data.rows?.length);  if (Date.now() - started > 10_000) break;   // or AbortController}

Mapping, not prices

Every listing carries the venue's own marketId, a tier (exact, normalized, fuzzy) and a confidence, plus the exact request that reads that market from the venue. Use the mapped row to decide what to compare, then read the prices from each venue with the source you already have.

Agents and MCP

POST https://api.matchwire.win/mcp speaks JSON-RPC 2.0 with your key in the same x-api-key header. Tools: list_sports, find_rows, get_row, get_venue_market, report_issue, service_status. Read-only; every tool result is narrowed by your key's plan exactly like the HTTP API.

js
import { Matchwire } from 'matchwire.win';const mw = new Matchwire({ apiKey: process.env.MATCHWIRE_API_KEY });
console.log((await mw.tools()).map((t) => t.name));const row = await mw.row('ev:nfl:arizona-cardinals:denver-broncos:2026-10-25');console.log(row.listings.map((l) => l.venue));

Plain text for coding assistants: matchwire.win/llms.txt · MCP reference: matchwire.win/docs/mcp/

Errors

js
import { MatchwireError } from 'matchwire.win';
try {  await mw.rows({ sport: 'nope' });} catch (error) {  if (error.isRateLimited) await sleep(error.retryAfterMs);   // 429  else if (error.isAuthError) /* key missing or revoked */ ;  else if (error.isPlanError) /* outside the plan's sports/venues */ ;  else throw error;}

Documentation

Python

python
from matchwire import Matchwire
mw = Matchwire(api_key=os.environ["MATCHWIRE_API_KEY"])rows = mw.rows(sport="nfl", venue=["kalshi", "poly"])["rows"]print(rows[0]["name"], [l["venue"] for l in rows[0]["listings"]])

See python/README.md. Standard library only, Python 3.9+.

License

MIT. Not affiliated with Kalshi, Polymarket or Predict.fun; venue names are used to say what is mapped.

來源:README.md,提交 f4a56fb

工具

0
工具後設資料尚未被收錄。

版本歷史

1
  1. v0.1.0最新Sep 30, 2026