Polymarket Bot Tutorial · Capítulo 3 de 32
Escolha sua stack de bot para Polymarket: Python (py-clob-client 0.34.6), Node.js (@polymarket/clob-client-v2 v1.0.6) ou Rust (sem SDK oficial, construído em cima de ethers-rs). Prós, contras, latência, exemplos de código.
O que este capítulo cobre
A escolha da linguagem é muito menos decisiva do que a maioria dos builders trata. A Polymarket expõe os mesmos endpoints REST e WebSocket para todas as linguagens; a escolha do SDK determina principalmente quanto código de integração você vai escrever por conta própria. Python e Node têm SDKs mantidos oficialmente; Rust não tem, mas é viável para o hot path. Este capítulo analisa os trade-offs, mostra a mesma tarefa de "buscar order book" em cada linguagem para deixar a diferença concreta e termina com um padrão de stack mista que é o que a maioria dos bots em produção realmente adota.
- Framework de decisão
- Python (escolha padrão)
- Node.js (devs full-stack)
- Rust (hot path crítico para latência)
- Comandos de setup por stack
- Esqueleto de código: buscar order book em 3 linguagens
- Quando misturar stacks (control plane em Python + hot path em Rust)
Framework de decisão
Três perguntas resolvem 90% da escolha da stack.
- Você já tem uma habilidade forte? Se você escreve Python todo dia, escreva o bot em Python. Se você escreve TypeScript todo dia, escreva o bot em Node. As diferenças de qualidade dos SDKs abaixo são reais, mas menores do que o custo de brigar com uma linguagem desconhecida.
- A estratégia é crítica para latência? Se sua vantagem depende de reagir em menos de 50ms (mercados cripto de 5 minutos, market making durante notícias), o hot path se beneficia de Rust ou Go. A maioria das estratégias não precisa disso.
- Você vai rodar mais de uma estratégia? Um único processo Python consegue gerenciar confortavelmente 10-20 mercados. Além disso, Node assíncrono ou Python com processos separados escala melhor.
O padrão honesto para um primeiro bot é Python. Troque só quando uma restrição medida obrigar.
Python (escolha padrão)
Python é o padrão porque o SDK é o mais completo e o ciclo de iteração é o mais rápido. py-clob-client na versão 0.34.6 (maio de 2026) cobre todo endpoint importante da CLOB v2: ordens de mercado e limit, variações FOK/FAK/GTC, leitura de order book, leitura de balance/allowance e operações diretas na chain via web3.py.
Prós: SDK maduro, análise de dados fácil com pandas, comunidade grande, web3.py para leituras on-chain. Contras: ergonomia de async é mais trabalhosa que em JavaScript, o GIL limita ganhos com múltiplos núcleos (raramente importa para um bot bound por I/O), e o tempo de inicialização em containers frios é lento.
Recomendado para: 80% dos builders. Especialmente para quem tem estratégia com backtesting, análise estatística ou qualquer trabalho de dados junto com execução.
Node.js (devs full-stack)
Node.js é a segunda stack com melhor suporte. @polymarket/clob-client-v2 na versão 1.0.6 cobre os mesmos endpoints que o SDK de Python, com tipos TypeScript em tudo. Async é nativo e rápido; o tratamento de WebSocket é excelente.
Prós: melhor história de async, tipos nativos de TypeScript, ecossistema grande para HTTP + WS, deploy fácil no mesmo runtime Node de um dashboard web. Contras: precisão numérica exige BigInt ou tratamento como string para token IDs grandes (IDs ERC-1155 têm 256 bits), e as ferramentas de dados equivalentes ao pandas são mais fracas.
Recomendado para: builders que já mantêm uma stack JavaScript e querem um único runtime. Também para quem está construindo um dashboard junto com o bot - compartilhar tipos entre o core do bot e um dashboard Next.js elimina uma classe de bugs.
Rust (hot path crítico para latência)
Rust não tem SDK oficial da Polymarket. Você constrói diretamente contra as APIs V2 REST e WebSocket usando reqwest (HTTP), tokio-tungstenite (WebSocket) e ethers-rs ou alloy para assinatura. Em termos de setup, são cerca de dois dias de trabalho contra 30 minutos em Python.
Prós: assinatura EIP-712 nativa sem subprocesso JS, construção de ordem em sub-milisegundos, perfil de memória determinístico sob carga, sem pausas de GC. Contras: sem SDK, você reimplementa o que usuários de Python recebem de graça (parsing de clobToken ID, validação de schema de resposta, gerenciamento de salt/nonce). O ganho de latência é de 20-100ms versus Python ajustado, o que só importa para estratégias sub-second.
Recomendado para: o hot path de um bot de market making, ou a perna que dispara trades de um bot de news-arb. Quase nunca para o bot inteiro.
Comandos de setup por stack
Comandos mínimos para obter uma ordem assinada funcionando na mainnet (um endpoint CLOB v2).
Python:
python -m venv venv && source venv/bin/activate
pip install py-clob-client==0.34.6 web3 python-dotenv
# Set POLYGON_RPC, PRIVATE_KEY, POLY_FUNDER in .env
Node:
npm init -y
npm install @polymarket/[email protected] ethers dotenv
# Set POLYGON_RPC, PRIVATE_KEY, POLY_FUNDER in .env
Rust:
cargo new --bin pmt
cd pmt
cargo add tokio reqwest serde serde_json ethers alloy tungstenite tokio-tungstenite
# Hand-write signer + endpoint client; no SDK shortcut.
Tempo até a primeira ordem: ~10 min em Python, ~15 min em Node, ~4-8 horas em Rust.
Esqueleto de código: buscar order book em 3 भाषagens
A mesma tarefa - buscar o order book de um token da Polymarket - em cada stack. As três chamam o mesmo endpoint REST da CLOB v2.
Python (py-clob-client):
from py_clob_client.client import ClobClient
client = ClobClient(host="https://clob.polymarket.com", chain_id=137)
book = client.get_order_book("<token_id>")
print(book.bids[:3], book.asks[:3])
Node (@polymarket/clob-client-v2):
import { ClobClient } from "@polymarket/clob-client-v2";
const c = new ClobClient({ host: "https://clob.polymarket.com", chain: 137 });
const book = await c.getOrderBook("<token_id>");
console.log(book.bids.slice(0,3), book.asks.slice(0,3));
Rust (HTTP direto):
let url = format!("https://clob.polymarket.com/book?token_id={}", token);
let book: serde_json::Value = reqwest::get(&url).await?.json().await?;
println!("{:?} {:?}", &book["bids"][..3], &book["asks"][..3]);
O shape da resposta é o mesmo nas três. O custo do Rust está em todo o resto - assinatura, construção de ordens, tratamento de erros - não no caminho de leitura.
Quando misturar stacks (control plane em Python + hot path em Rust)
O padrão ao qual muitos bots em produção convergem: Python para tudo que envolve decisões, Rust para a parte de execução em milissegundos.
Arquitetura: um processo Python lê o estado do mercado, executa a lógica da estratégia e escreve um pequeno arquivo de comando (por exemplo {"action":"buy","token":"...","size":10,"price":0.45}) em um Unix socket. Um daemon Rust escuta esse socket, assina a ordem e a envia para a CLOB. O processo Python pode ser lento e conveniente; o daemon Rust é rápido e minimalista.
A transferência é a chave: ao isolar a etapa de ordem assinada, o orçamento de crash do Python é recuperado sem sacrificar latência. Usamos exatamente esse padrão nos nossos bots em produção - Python emite intenções, um daemon Node em /tmp/clob.sock cuida da assinatura. A versão em Node do daemon é boa para sub-100ms; Rust só vale a pena abaixo de 50ms.












