O SDK Python da Polymarket em 2026 (e como sair do py-clob-client)
Se o seu código ainda importa ClobClient de py_clob_client, ele está construído sobre um pacote substituído — assim como a maior parte do código da Polymarket que um assistente de IA vai escrever para você. Veja o SDK atual e como migrar.
O principal
A Polymarket agora oferece SDKs unificados: polymarket-client para Python e @polymarket/client para TypeScript. Eles substituem py-clob-client, @polymarket/clob-client-v2, @polymarket/builder-relayer-client e @polymarket/builder-signing-sdk. Um SDK unificado em Rust está em desenvolvimento.
Isso importa mais do que uma atualização de versão comum por um motivo: quase todo exemplo de código da Polymarket na internet é anterior a ele. Posts de blog, respostas no Stack Overflow, exemplos no GitHub e — como foram treinados com esse material — o código que seu assistente de IA escreve quando você pede um bot para a Polymarket. Se você já se pegou depurando imports que não existem, é por isso.
O que realmente mudou
A abordagem antiga dava a você um cliente por serviço da Polymarket. Você importava um cliente CLOB para o livro de ofertas, chamava a Gamma por HTTP cru para descobrir mercados, acessava a Data API separadamente para posições e incluía um pacote de builder-signing se precisasse de transações do relayer. Quatro modelos mentais, quatro formatos de erro, quatro estilos de paginação.
O SDK unificado junta tudo isso em um só cliente que cobre todas as superfícies.
| Clientes anteriores | SDK unificado | |
|---|---|---|
| Pacotes | Vários, um por serviço | Um |
| Superfícies da Polymarket | APIs específicas por serviço | Uma única interface de cliente |
| Modelos de dados | Dicts JSON crus | Modelos tipados |
| Paginação | Varia por API | Um paginador consistente |
| Autenticação e assinatura | Implementadas por cliente | Helpers do SDK |
| Tempo real | Conectar a cada WebSocket | subscribe() junta os feeds |
Instalação
pip install polymarket-client
# uv add polymarket-client
# poetry add polymarket-clientO nome do pacote e o import são diferentes
Você instala polymarket-client, mas importa de polymarket. Isso confunde as pessoas logo na primeira linha, e também é um jeito confiável de identificar código gerado que nunca foi executado — se um trecho faz import polymarket_client, ninguém o rodou.
Quatro clientes — escolha com cuidado
| Cliente | Dados públicos | Trading | Tempo real | Use para |
|---|---|---|---|---|
AsyncPublicClient | Sim | Não | Sim | Bots, coletores de dados |
AsyncSecureClient | Sim | Sim | Sim | Bots de trading |
PublicClient | Sim | Não | Não | Scripts, notebooks |
SecureClient | Sim | Sim | Não | Scripts que operam |
O tempo real é só assíncrono
PublicClient e SecureClient não implementam subscribe(). Se você pretende fazer streaming de atualizações do livro — e qualquer bot sério deveria —, precisa de um dos clientes assíncronos. Escolher um cliente síncrono no início e descobrir isso depois rende uma refatoração chata.
import asyncio
from polymarket import AsyncPublicClient
async def main() -> None:
async with AsyncPublicClient() as client:
pages = client.list_markets(closed=False)
first = await pages.first_page()
for market in first.items:
print(market.slug)
asyncio.run(main())Os dados públicos não exigem credenciais, então construa e teste tudo o que puder com o AsyncPublicClient antes de introduzir uma chave. Descoberta, parsing, paginação, geração de sinais e backoff podem ser exercitados sem nada em risco.
Paginação
Uma única interface de paginador em todos os métodos de listagem. Três formas de consumi-lo, dependendo de você se importar ou não com os limites entre páginas:
pages = client.list_markets(closed=False, page_size=10)
# 1. Page at a time — use this when you need to control pacing
# against the tight /markets rate limit (300 req / 10s).
async for page in pages:
for market in page.items:
...
# 2. Item at a time, boundaries ignored.
async for market in pages.iter_items():
...
# 3. Manual, resumable.
page = await pages.first_page()
if page.next_cursor:
nxt = await pages.from_cursor(page.next_cursor).first_page()next_cursor é opaco, então guarde-o literalmente
Não faça parsing, não decodifique e não monte cursores. Guarde a string como está se quiser retomar uma varredura longa depois, e omita-a para começar do início. Montar seu próprio cursor é o tipo de coisa que funciona até a codificação mudar.
Modelos tipados
Os métodos retornam tipos de verdade em vez de dicionários, exportados pelo pacote de nível superior:
from polymarket import Event, Market, OrderBook, PriceHistoryPointEsta é a melhoria menos glamorosa e provavelmente a mais valiosa. Com os clientes antigos, um campo renomeado ou ausente aparecia como um KeyError no fundo do loop da sua estratégia, em tempo de execução — muitas vezes em produção, muitas vezes com uma posição aberta. Os modelos tipados levam essa falha para onde ela deve estar.
Assinaturas em tempo real
subscribe() junta vários feeds em um único stream de eventos tipados, o que é uma melhoria genuína em relação a gerenciar várias conexões WebSocket na mão.
from polymarket.streams import MarketSpec, SportsSpec
async with await client.subscribe(
[MarketSpec(token_ids=[token_id]), SportsSpec()],
) as stream:
async for event in stream:
# MarketBookEvent | MarketPriceChangeEvent
# | MarketLastTradePriceEvent | MarketTickSizeChangeEvent
# | MarketBestBidAskEvent | NewMarketEvent
# | MarketResolvedEvent | SportsEvent
handle(event)O SDK cuida do heartbeat, dos frames e das reconexões que você teria que implementar por conta própria — incluindo a exigência de enviar PING a cada 10 segundos em uma conexão crua. Detalhes no guia de WebSocket.
Enviando uma ordem
market = await client.get_market(slug="<market-slug>")
token_id = market.outcomes.yes.token_id
assert token_id is not None
response = await client.place_market_order(
token_id=token_id,
side="BUY",
amount="10", # pUSD to spend, not shares to buy
)
if not response.ok:
raise RuntimeError(response.message)
# Settlement is on-chain and asynchronous.
hashes = await client.wait_for_order_fill_settlement(response)
# Reconcile rather than assuming.
page = await client.list_positions(market=[market.condition_id]).first_page()
position = next((p for p in page.items if p.token_id == token_id), None)amount é o gasto, não o tamanho
place_market_order(amount="10") significa gastar até 10 pUSD, e não comprar 10 cotas. Em um contrato negociado a 0.20, isso dá mais ou menos 50 cotas. Ler isso errado é um jeito fácil de abrir uma posição cinco vezes maior do que a pretendida.
Migrando do py-clob-client
- Faça um inventário de todas as chamadas à Polymarket, incluindo chamadas cruas com
requestspara a Gamma e a Data API. Elas também entram no escopo — o SDK unificado as cobre, e incorporá-las é a maior parte do benefício. - Instale o
polymarket-cliente remova os pacotes antigos. Manter os dois instalados para migrar aos poucos é um convite para importar o símboloclienterrado. - Substitua a construção dos clientes. Um único
AsyncSecureClient.create(...)substitui os antigos clientes por serviço e o tratamento separado de credenciais de cada um. - Troque o acesso por dict por acesso por atributo.
market["condition_id"]viramarket.condition_id. É tedioso, e é aí que o verificador de tipos começa a se pagar. - Reescreva a paginação com a interface de paginador em vez de loops manuais de offset ou cursor.
- Substitua o código WebSocket feito à mão por
subscribe()e apague sua lógica de heartbeat e reconexão. - Rode primeiro de novo os seus caminhos somente leitura, com o cliente público, antes de deixar qualquer coisa enviar uma ordem.
O TypeScript ganha adaptadores de signer
O SDK TypeScript inclui adaptadores para Viem, Privy e Ethers v5, então você conecta a biblioteca de carteira que já usa em vez de implementar uma assinatura específica do CLOB. Se você mantinha um signer personalizado com o antigo pacote de builder-signing, esse código agora pode ser apagado.
Por que seu assistente de IA erra nisso
Vale tratar disso diretamente, já que é assim que muita gente chega aqui. Peça a um LLM código Python para a Polymarket e você vai receber, com muita frequência, imports de py_clob_client, construção de ClobClient(...) e objetos OrderArgs. O modelo não está com defeito — ele está reproduzindo a esmagadora maioria do código da Polymarket que já viu, que é anterior aos SDKs unificados.
- Confira primeiro a linha de import.
from polymarket import ...é o atual;from py_clob_client...não é. - Cole a documentação atual no contexto. A Polymarket publica Markdown legível por máquina em
docs.polymarket.com/llms.txt, e toda página tem uma variante.md. Dar ao modelo a coisa real funciona melhor do que discutir com ele. - Desconfie de código confiante que não roda. O código gerado frequentemente mistura APIs antigas e novas em algo que nunca existiu.
O mesmo problema vale para provedores de dados. Publicamos llms.txt, llms-full.txt e uma especificação OpenAPI, e permitimos crawlers de IA, justamente para que os assistentes consigam escrever integrações corretas com a PolyTest sem chutar. Alguns provedores bloqueiam esses crawlers, o que é uma escolha legítima, mas significa que seu assistente vai improvisar a superfície da API deles.
O que o SDK ainda não consegue fazer
O SDK unificado é uma interface muito melhor para as APIs da Polymarket. Ele não muda o que essas APIs contêm — e o que quem constrói bots mais quer não está nelas.
Não existe livro de ofertas histórico. client.get_market() retorna os metadados de um mercado resolvido, mas o livro dele sumiu: /book retorna 404, e prices-history guarda só cerca de um ponto por minuto. Nenhum método do SDK, plano ou credencial recupera o livro.
Para fazer backtesting você precisa de snapshots gravados enquanto os mercados estavam ativos. A PolyTest os oferece para os mercados cripto Up/Down — mais de 240M de snapshots pontuais, 8 níveis de profundidade por lado, timestamps abaixo de um segundo, mercados resolvidos mantidos. É uma API REST simples com um header X-API-Key, então entra no mesmo código assíncrono, ao lado do SDK. Comece grátis ou leia como criar um bot para ver o caminho completo.
Perguntas frequentes
- Qual é o SDK Python oficial da Polymarket em 2026?
- O SDK Python oficial é o polymarket-client, instalado com pip install polymarket-client e importado como polymarket. É o SDK unificado que cobre o CLOB, a Gamma e a Data API, além dos streams em tempo real, por meio de uma única interface de cliente, e substitui o py-clob-client. O equivalente em TypeScript é o @polymarket/client, e um SDK unificado em Rust está em desenvolvimento.
- O py-clob-client foi descontinuado?
- Ele foi substituído pelo SDK unificado polymarket-client, junto com os pacotes TypeScript @polymarket/clob-client-v2, @polymarket/builder-relayer-client e @polymarket/builder-signing-sdk. A Polymarket publica um guia de migração para integrações existentes. A maioria dos tutoriais e do código gerado por IA ainda faz referência aos pacotes antigos porque eles são bem anteriores aos SDKs unificados.
- Qual cliente Python da Polymarket devo usar para um bot de trading?
- Use o AsyncSecureClient. Há quatro clientes: AsyncPublicClient e PublicClient para dados públicos, AsyncSecureClient e SecureClient para trading e acesso à conta. As assinaturas em tempo real são só assíncronas — os clientes síncronos não implementam subscribe() —, então qualquer bot que faça streaming de atualizações do livro precisa de um cliente assíncrono. Construa e teste com o AsyncPublicClient antes de introduzir credenciais.
- Como pagino resultados com o SDK Python da Polymarket?
- Os métodos de listagem retornam um paginador. Itere diretamente sobre ele para ter controle página a página, chame iter_items() para iterar sobre registros individuais ignorando os limites entre páginas, ou use first_page() e from_cursor() para varreduras manuais que podem ser retomadas. O valor de next_cursor é opaco, então guarde-o literalmente em vez de fazer parsing ou montar um, e omita-o para começar da primeira página.
- Por que o ChatGPT ou o Claude geram código da Polymarket que não funciona?
- Como a esmagadora maioria do código da Polymarket nos dados de treinamento é anterior aos SDKs unificados, os modelos tendem a produzir imports de py_clob_client, construção de ClobClient e objetos OrderArgs. Confira primeiro a linha de import — from polymarket import é o atual, from py_clob_client não é. A Polymarket publica documentação legível por máquina em docs.polymarket.com/llms.txt e uma variante .md de cada página, então colar a documentação atual no contexto funciona melhor do que corrigir o modelo repetidamente.
- O SDK da Polymarket consegue buscar dados históricos do livro de ofertas?
- Não. O SDK é uma interface para as APIs da Polymarket e não consegue retornar dados que essas APIs não guardam. Os metadados de um mercado resolvido podem ser obtidos, mas o livro de ofertas dele retorna 404 e o histórico de preços guarda só cerca de um ponto por minuto. O backtesting exige snapshots pontuais gravados por terceiros enquanto os mercados estavam ativos.
Tenha os dados históricos que a Polymarket não guarda
A PolyTest registra os mercados cripto Up/Down da Polymarket enquanto estão ativos — mais de 240M de snapshots com 8 níveis de profundidade do livro de ofertas, timestamps abaixo de um segundo e mercados resolvidos preservados. Comece com um teste grátis de 3 dias.
Continue lendo
Como criar um bot de trading para a Polymarket
A maioria dos tutoriais de bots para a Polymarket usa SDKs que não existem mais. Este é o caminho atual de ponta a ponta — o que instalar em 2026, como a autenticação realmente funciona, onde estão as lacunas de dados e os modos de falha que matam bots na primeira semana.
WebSockets da Polymarket: dados em tempo real que não caem
Fazer polling do livro de ofertas é a forma mais comum de queimar o orçamento de limite de requisições sem ganhar nada. Veja os quatro streams, as opções de assinatura que ninguém documenta e o modo de falha em que seu bot recebe silêncio e acha que é calmaria.
A API da Polymarket mapeada: Gamma vs CLOB vs Data API
Quem está começando perde um dia com o mesmo problema: a Polymarket não tem uma API, tem quatro, e o endpoint que você quer raramente está na primeira que você tentou. Este é o mapa completo.