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