MarketMaster

Dados somente leitura de mercados preditivos da Kalshi e Polymarket: vantagens de valor esperado, arbitragem entre plataformas, instantâneos de mercado e negociações de grandes investidores.

Documentação

Introdução

A API do MarketMaster oferece acesso programático ao nosso mecanismo de mercados de previsão multiplataforma: edges (mercados com preço incorreto classificados por tamanho do edge), markets (instantâneos normalizados entre plataformas), uma consulta de market individual, spreads de arbitragem entre plataformas, o feed de negociações de whales e um stream WebSocket em tempo real. Cada endpoint REST é um simples GET que retorna JSON.

A API é somente leitura. Ela nunca realiza negociações, move fundos ou expõe dados de qualquer usuário individual — apenas dados públicos de mercado.

REST · JSON WebSocket streaming Autenticação por API key CORS habilitado Servidor MCP v1

Início rápido

1. Gere uma chave no seu dashboard (cartão Developer API). Copie-a — ela é exibida apenas uma vez.
2. Envie-a no cabeçalho x-api-key.
3. Chame um endpoint.

curl

curl "https://api.marketmaster.live/v1/edges?limit=5" \
  -H "x-api-key: mmk_live_your_key_here" \
  -H "User-Agent: my-app/1.0"

SDKs e MCP

Clientes oficiais com autenticação, tentativas, tratamento de limite de taxa e um User-Agent adequado integrado. Ou pule o código completamente e conecte os dados ao Claude ou Cursor via MCP.

JavaScript / TypeScript

npm install @marketmaster/sdk
import { MarketMaster } from "@marketmaster/sdk";

const mm = new MarketMaster({ apiKey: process.env.MM_API_KEY });
const { edges } = await mm.edges({ platform: "kalshi", min_edge: 5 });

Python

pip install marketmaster
from marketmaster import MarketMaster

mm = MarketMaster(api_key="mmk_live_your_key")
edges = mm.edges(platform="kalshi", min_edge=5)["edges"]

MCP — Claude Desktop / Cursor

Seis ferramentas somente leitura (mm_edges, mm_markets, mm_market, mm_arbitrage, mm_whales, mm_status) via npx — sem instalação. Adicione ao claude_desktop_config.json (ou ~/.cursor/mcp.json):

{
  "mcpServers": {
    "marketmaster": {
      "command": "npx",
      "args": ["-y", "@marketmaster/mcp"],
      "env": { "MARKETMASTER_API_KEY": "mmk_live_your_key" }
    }
  }
}

MCP — endpoint hospedado (nada para instalar)

As mesmas seis ferramentas também são servidas a partir de um endpoint MCP hospedado Streamable HTTP, para clientes que se conectam a uma URL em vez de iniciar um processo local. Autentique com a mesma chave como um token bearer.

https://api.marketmaster.live/mcp
{
  "mcpServers": {
    "marketmaster": {
      "url": "https://api.marketmaster.live/mcp",
      "headers": { "Authorization": "Bearer mmk_live_your_key" }
    }
  }
}

Use npx acima se quiser o servidor rodando localmente; use o endpoint hospedado se o seu cliente aceitar apenas uma URL, ou se preferir não executar um processo. Ambos expõem ferramentas idênticas e contam contra a mesma cota.

O MarketMaster está listado no Registro MCP oficial como live.marketmaster/mcp e no Smithery. Uma descrição legível por máquina do servidor é publicada em https://api.marketmaster.live/.well-known/mcp/server-card.json.

Cada ferramenta MCP é anotada com readOnlyHint: true. Um agente conectado ao MarketMaster pode ler dados de mercado e nada mais — ele não pode realizar uma negociação, mover fundos ou acessar a conta de outro usuário.

Autenticação

Autentique cada requisição com sua chave de API no cabeçalho x-api-key. As chaves têm o formato mmk_live_… e são gerenciadas a partir do seu dashboard. Uma chave é exibida uma vez na criação; armazene-a em uma variável de ambiente, nunca a envie para o controle de versão e rotacione a partir do dashboard se ela for exposta.

Trate sua chave como uma senha. Requisições sem uma chave válida retornam 401.

Sempre envie um cabeçalho User-Agent descritivo. Requisições de agentes de bibliotecas padrão (ex.: python-urllib) podem ser rejeitadas pela nossa proteção de bots de borda. Nossos SDKs oficiais definem um automaticamente.

Convenções

URL base

https://api.marketmaster.live
FormatoTodas as requisições e respostas são JSON.
PreçosProbabilidades em 0,0–1,0 (ex.: 0.43 = 43¢ / 43% de chance implícita).
Carimbos de data/horaISO 8601, UTC (ex.: 2026-06-20T21:25:12Z).
Plataformaskalshi, polymarket.
CORSHabilitado para todas as origens — chame diretamente de um aplicativo de navegador.
PaginaçãoEndpoints de lista aceitam limit e offset; a resposta inclui has_more.
CacheEndpoints de dados enviam Cache-Control: public, max-age=30.

Preços

Todos os endpoints — incluindo arbitragem, edges, feed de whales e streaming WebSocket — estão disponíveis em todos os planos.

Grátis

$0/mês

60 req/min · 1.000 req/mês

  • Todos os 6 endpoints REST
  • Edges, arb e feed de whales
  • WebSocket: 1 conexão
  • 1 chave de API

Mais popular

API Starter

$9,99/mês

120 req/min · 50.000 req/mês

  • Tudo do Grátis
  • 2× limite de taxa
  • WebSocket: 3 conexões
  • Nenhum aplicativo de consumo necessário

API Pro

$29,99/mês

300 req/min · 1.000.000 req/mês

  • Tudo do Starter
  • 5× limite de taxa
  • WebSocket: 10 conexões
  • Para pipelines de alta frequência

MarketMaster Pro (assinatura de consumo de $12,99/mês) também inclui acesso à API com 240 req/min · 200k req/mês, WebSocket: 5 conexões, além de scanner, alertas e overlay.

Por que MarketMaster em vez de alternativas?

RecursoMarketMasterConcorrentes
Feed de arbitragem✅ Todos os planosSomente Enterprise
Rankings de EV / edge✅ Todos os planosSomente Enterprise
Feed de negociações de whales✅ Todos os planosSomente Enterprise
Streaming WebSocket✅ Todos os planosSomente Enterprise
Preço de entradaGrátis para sempre$49+/mês para começar
Kalshi + Polymarket + mais✅ UnificadoPlataforma única

Limites de taxa

Os limites são aplicados por conta em duas janelas: uma taxa por minuto e uma cota mensal. Os limites sobrevivem à rotação de chaves.

PlanoTaxaCota mensalConexões WS
free60 req / min1.0001
api_starter120 req / min50.0003
pro (consumidor)240 req / min200.0005
api_pro300 req / min1.000.00010

Cabeçalhos de resposta de limite de taxa

X-RateLimit-Limit-MinuteSeu teto por minuto.
X-RateLimit-Remaining-MinuteRequisições restantes neste minuto.
X-RateLimit-Limit-MonthSua cota mensal.
X-RateLimit-Remaining-MonthRequisições restantes neste mês.

Exceder a taxa por minuto retorna 429 rate_limited; esgotar a cota mensal retorna 429 quota_exceeded. Ambos incluem um cabeçalho Retry-After em segundos.

Edges

GET/v1/edges

Os mercados com maior erro de precificação agora — o valor justo do nosso modelo vs. o preço ao vivo, classificados por tamanho do edge. Retorna uma linha por mercado, deduplicada para a leitura mais recente.

Parâmetros de consulta

ParâmetroTipoDescrição
platformstringFiltrar por plataforma: kalshi, polymarket.
categorystringFiltrar por categoria, ex.: politics, sports, crypto.
limitintegerMáximo de linhas. Padrão 50, máximo 200.
offsetintegerLinhas para pular. Padrão 0.
min_edgenumberEdge mínimo em pontos percentuais.

Resposta: edges[]

CampoTipoDescrição
platformstringPlataforma.
market_idstringIdentificador nativo do mercado na plataforma.
market_titlestringPergunta do mercado.
market_categorystringCategoria (ex.: politics).
outcomestringYES ou NO.
pricenumberPreço de mercado ao vivo (0–1).
fair_valuenumberProbabilidade justa estimada pelo modelo (0–1).
edge_pctnumberEdge em pontos percentuais. Maior = mais erro de precificação.
confidencenumberConfiança do modelo (0–1).
match_group_idintegerID do grupo de correspondência entre plataformas. Mercados que compartilham este ID são o mesmo evento do mundo real em plataformas diferentes.
expires_atstringQuando o mercado fecha (ISO 8601).
computed_atstringQuando este edge foi calculado (ISO 8601).

Exemplo

curl

curl "https://api.marketmaster.live/v1/edges?platform=kalshi&limit=2" \
  -H "x-api-key: mmk_live_your_key_here"

JavaScript

const res = await fetch(
  "https://api.marketmaster.live/v1/edges?platform=kalshi&limit=2",
  { headers: { "x-api-key": process.env.MM_API_KEY } }
);
const { edges } = await res.json();

Python

import requests
r = requests.get(
    "https://api.marketmaster.live/v1/edges",
    params={"platform": "kalshi", "limit": 2},
    headers={"x-api-key": MM_API_KEY},
)
edges = r.json()["edges"]

Resposta

{
  "count": 2,
  "edges": [{
    "platform": "kalshi", "market_id": "PRES-2028-DEM",
    "market_title": "Will a Democrat win the 2028 election?",
    "outcome": "YES", "price": 0.43, "fair_value": 0.51,
    "edge_pct": 8.0, "confidence": 0.62,
    "expires_at": "2028-11-07T05:00:00Z", "computed_at": "2026-06-20T21:25:12Z"
  }],
  "generated_at": "2026-06-20T21:25:34Z"
}

Markets

GET/v1/markets

O instantâneo mais recente de todos os mercados rastreados em ambas as plataformas — título, categoria, preço SIM/NÃO, volume em 24h e horário de fechamento. Ordenado por volume em 24h (mais ativos primeiro).

Parâmetros de consulta

ParâmetroTipoDescrição
sourcestringFiltrar por plataforma (alias: platform).
categorystringFiltrar por categoria.
limitintegerMáximo de linhas. Padrão 100, máximo 500.
offsetintegerLinhas para pular. Padrão 0.

Resposta: markets[]

CampoTipoDescrição
sourcestringPlataforma.
source_market_idstringID nativo do mercado na plataforma.
titlestringPergunta do mercado.
categorystringCategoria.
yes_pricenumberPreço SIM atual (0–1).
no_pricenumberPreço NÃO atual (0–1).
volume_24h_usdnumber | nullVolume negociado em 24h em USD.
close_timestring | nullHorário de fechamento do mercado (ISO 8601).
last_trade_atstring | nullCarimbo de data/hora da última negociação (ISO 8601).
fetched_atstringQuando capturamos o instantâneo deste mercado pela última vez (ISO 8601).

curl

curl "https://api.marketmaster.live/v1/markets?category=politics&limit=50" \
  -H "x-api-key: mmk_live_your_key_here"

Market

GET/v1/market

O instantâneo mais recente de um único mercado, além de quaisquer edges ao vivo calculados para ele. Identifique por source + id.

Parâmetros de consulta

ParâmetroTipoDescrição
sourcestring · obrigatórioPlataforma: kalshi, polymarket.
idstring · obrigatórioID nativo do mercado na plataforma.

Retorna market (mesma forma de markets[]) e edges[] (mesma forma de edges[], mais recentes primeiro). ID desconhecido retorna 404 not_found.

curl

curl "https://api.marketmaster.live/v1/market?source=kalshi&id=PRES-2028-DEM" \
  -H "x-api-key: mmk_live_your_key_here"

Arbitragem

GET/v1/arbitrage

Spreads de preço entre plataformas para o mesmo resultado em mercados correspondentes, classificados do mais amplo para o mais estreito.

Os spreads são indicativos e brutos de taxas, slippage e profundidade de oferta/demanda — não é arbitragem garantida. Sempre confirme os preços executáveis na plataforma.

Parâmetros de consulta

ParâmetroTipoDescrição
min_spreadnumberSpread mínimo em pontos percentuais.
limitintegerMáximo de linhas. Padrão 50, máximo 200.
offsetintegerLinhas para pular. Padrão 0.

Resposta: opportunities[]

CampoTipoDescrição
match_group_idintegerGrupo de correspondência entre plataformas.
titlestringPergunta do mercado.
outcomestringResultado sendo comparado (YES / NO).
spread_pctnumberPreço mais caro menos o mais barato, em pontos percentuais.
buy_yesobjectPlataforma mais barata: { platform, market_id, price }.
sell_yesobjectPlataforma mais cara: { platform, market_id, price }.
computed_atstringQuando esses preços foram calculados (ISO 8601).

curl

curl "https://api.marketmaster.live/v1/arbitrage?min_spread=2&limit=10" \
  -H "x-api-key: mmk_live_your_key_here"

Whales

GET/v1/whales

Negociações recentes de grande porte com dinheiro real entre plataformas, das mais recentes para as mais antigas.

Parâmetros de consulta

ParâmetroTipoDescrição
sourcestringFiltrar por plataforma.
minintegerTamanho mínimo da negociação em USD.
limitintegerMáximo de linhas. Padrão 50, máximo 200.
offsetintegerLinhas para pular. Padrão 0.

Resposta: trades[]

CampoTipoDescrição
sourcestringPlataforma.
source_market_idstringID nativo do mercado na plataforma.
trader_namestring | nullIdentificador público do trader, quando disponível.
sidestringLado da negociação (buy / sell).
outcomestringResultado negociado.
size_usdnumberTamanho nocional em USD.
pricenumberPreço da negociação (0–1).
titlestringPergunta do mercado.
trade_timestringQuando a negociação foi registrada (ISO 8601).
tx_hashstring | nullHash da transação on-chain para plataformas on-chain.

curl

curl "https://api.marketmaster.live/v1/whales?min=10000&limit=20" \
  -H "x-api-key: mmk_live_your_key_here"

Status

Retorna o plano da sua chave, limites e uso atual. Use para monitorar a cota restante.

{
  "ok": true,
  "tier": "free",
  "limits": { "minute": 60, "month": 1000 },
  "usage":  { "minute": 3,  "month": 412 }
}

Streaming WebSocket

Conecte-se uma vez e receba eventos enviados no momento em que estiverem prontos — sem polling. O stream envia lotes de edges e notificações de negociações de whales do nosso pipeline de ingestão à medida que cada lote é produzido.

WSS /api/v1/stream Tempo real

URL de conexão

wss://api.marketmaster.live/api/v1/stream

Autenticação

Sua chave de API deve ser enviada no momento da conexão. Duas opções dependendo do ambiente:

AmbienteComo autenticar
Node.js / Python / servidorEnvie x-api-key: mmk_live_... nos cabeçalhos da solicitação de upgrade do WebSocket.
NavegadorAcrescente ?api_key=mmk_live_... como parâmetro de consulta — navegadores não podem definir cabeçalhos personalizados em conexões WebSocket.

Nunca exponha sua chave de API em código de navegador público no lado do cliente. Use um token de curta duração ou um relé no lado do servidor para implantações em navegador.

Canais

edges

Enviado a cada ~10 min

Novo lote de edges calculado. Busque /v1/edges ao receber para obter a lista atualizada.

whales

Enviado a cada ~5 min

Novas negociações de whales ingeridas. Busque /v1/whales ao receber para obter os últimos preenchimentos.

prices/*

Reservado

Streaming de preços por mercado — em breve.

O stream envia uma notificação leve (contagem + timestamp) em vez do payload completo. Puxe o endpoint REST relevante ao receber para obter os dados — isso mantém os payloads do stream pequenos e permite filtrar antes de buscar.

Mensagens cliente → servidor (envie como JSON)

AçãoPayloadEfeito
subscribe{"action":"subscribe","channel":"edges"}Comece a receber eventos para este canal.
unsubscribe{"action":"unsubscribe","channel":"edges"}Pare de receber eventos para este canal.
ping{"action":"ping"}O servidor responde com pong. Use para manter a conexão ativa.

Mensagens servidor → cliente (receba como JSON)

TipoExemplo de payloadQuando
welcome{"type":"welcome","tier":"free","conn_id":"abc"}Imediatamente ao conectar.
subscribed{"type":"subscribed","channel":"edges"}Após uma inscrição bem-sucedida.
event{"type":"event","channel":"edges","data":{"count":34,"ts":1751000000000}}Novos dados disponíveis para um canal inscrito.
pong{"type":"pong"}Resposta ao seu ping.
error{"type":"error","code":"too_many_connections","message":"..."}Falha de autenticação, limite de conexões excedido ou mensagem inválida.

Limites de conexão por nível

NívelMáx. de conexões simultâneasMáx. de inscrições de canal / conexão
free15
api_starter320
pro (consumidor)550
api_pro10100

Exemplo — navegador

JavaScript (navegador)

// Pass key as query param; browsers can't set WebSocket headers
const ws = new WebSocket(
  \`wss://api.marketmaster.live/api/v1/stream?api_key=${MM_API_KEY}\`
);

ws.onopen = () => {
  ws.send(JSON.stringify({ action: "subscribe", channel: "edges"  }));
  ws.send(JSON.stringify({ action: "subscribe", channel: "whales" }));
};

ws.onmessage = async (e) => {
  const msg = JSON.parse(e.data);
  if (msg.type === "event" && msg.channel === "edges") {
    // New edge batch — pull fresh data
    const { edges } = await fetch("/v1/edges?limit=20", {
      headers: { "x-api-key": MM_API_KEY }
    }).then(r => r.json());
    renderEdges(edges);
  }
};

// Keep-alive ping every 30s
setInterval(() => ws.send(JSON.stringify({ action: "ping" })), 30_000);

Exemplo — Node.js

JavaScript (Node.js / biblioteca ws)

import WebSocket from "ws";

const ws = new WebSocket("wss://api.marketmaster.live/api/v1/stream", {
  headers: { "x-api-key": process.env.MM_API_KEY },
});

ws.on("open", () => {
  ws.send(JSON.stringify({ action: "subscribe", channel: "edges"  }));
  ws.send(JSON.stringify({ action: "subscribe", channel: "whales" }));
});

ws.on("message", (raw) => {
  const msg = JSON.parse(raw);
  console.log(msg.type, msg.channel ?? "", msg.data ?? "");
});

Exemplo — Python

Python (biblioteca websockets)

import asyncio, json, websockets

async def stream():
    uri = "wss://api.marketmaster.live/api/v1/stream"
    async with websockets.connect(uri, extra_headers={"x-api-key": MM_API_KEY}) as ws:
        await ws.send(json.dumps({"action": "subscribe", "channel": "edges"}))
        await ws.send(json.dumps({"action": "subscribe", "channel": "whales"}))
        async for raw in ws:
            msg = json.loads(raw)
            print(msg["type"], msg.get("channel"), msg.get("data"))

asyncio.run(stream())

Erros

Erros retornam o status HTTP apropriado com um envelope JSON:

{ "error": { "code": "rate_limited", "message": "Per-minute rate limit exceeded." } }
StatusCódigoSignificado
401missing_api_keyNenhum cabeçalho x-api-key enviado.
401invalid_api_keyChave malformada, desconhecida ou revogada.
400invalid_parameterParâmetro de consulta inválido ou parâmetro obrigatório ausente.
404not_foundNenhum recurso correspondente (ex.: id de mercado desconhecido).
426websocket_required/api/v1/stream deve estar conectado via WebSocket.
429rate_limitedTaxa por minuto excedida — verifique o cabeçalho Retry-After.
429quota_exceededCota mensal esgotada — reinicia no início do mês.
500auth_errorProblema temporário ao validar a chave — tente novamente.
502upstream_errorProblema transitório de carregamento de dados — tente novamente.
503streaming_unavailableStreaming WebSocket temporariamente indisponível.

Frames de erro do WebSocket usam o mesmo formato code / message, entregues como uma mensagem JSON antes de o servidor fechar a conexão.

Versionamento e mudanças

A API é versionada no caminho (/v1/). Podemos adicionar novos campos às respostas e novos canais ao stream a qualquer momento — escreva clientes que ignorem campos e tipos de mensagem desconhecidos. Mudanças que quebram compatibilidade seriam lançadas sob um novo caminho de versão. Esta é uma versão inicial; endpoints, limites e canais de stream ainda podem evoluir.

Aviso legal

Valores de edge e fair-value são estimativas de modelo apenas para fins informativos. Não são aconselhamento de investimento, nem garantia de lucro. Dados fornecidos como estão, sem garantia. Você é responsável por cumprir os termos e as leis aplicáveis de qualquer plataforma em que negociar.