Todos los artículos
GuíasPythonSDKAPI de Polymarket

El SDK de Python de Polymarket en 2026 (y cómo dejar py-clob-client)

Si tu código todavía importa ClobClient desde py_clob_client, está construido sobre un paquete sustituido, igual que la mayor parte del código de Polymarket que te escribirá un asistente de IA. Este es el SDK actual y cómo pasarte a él.

10 min de lectura

Lo principal

Polymarket ahora ofrece SDK unificados: polymarket-client para Python y @polymarket/client para TypeScript. Sustituyen a py-clob-client, @polymarket/clob-client-v2, @polymarket/builder-relayer-client y @polymarket/builder-signing-sdk. Hay un SDK unificado de Rust en desarrollo.

Esto importa más que un cambio de versión normal por una razón: casi todos los ejemplos de código de Polymarket de internet son anteriores. Artículos de blog, respuestas de Stack Overflow, ejemplos de GitHub y (como se entrenaron con ese material) el código que escribe tu asistente de IA cuando le pides un bot de Polymarket. Si te has visto depurando imports que no existen, este es el motivo.

Qué cambió realmente

El enfoque anterior te daba un cliente por cada servicio de Polymarket. Importabas un cliente CLOB para el libro de órdenes, llamabas a Gamma por HTTP sin más para descubrir mercados, consultabas aparte la Data API para las posiciones y añadías un paquete de builder-signing si necesitabas transacciones del relayer. Cuatro modelos mentales, cuatro formas de error, cuatro estilos de paginación.

El SDK unificado lo reduce todo a un único cliente que cubre todas las superficies.

Clientes anterioresSDK unificado
PaquetesVarios, uno por servicioUno
Superficies de PolymarketAPIs específicas de cada servicioUna sola interfaz de cliente
Modelos de datosDiccionarios JSON sin tiparModelos tipados
PaginaciónDistinta en cada APIUn paginador coherente
Autenticación y firmaImplementarlas en cada clienteHelpers del SDK
Tiempo realConectarse a cada WebSocketsubscribe() combina los feeds

Instalación

pip install polymarket-client
# uv add polymarket-client
# poetry add polymarket-client

El nombre del paquete y el del import son distintos

Instalas polymarket-client, pero importas desde polymarket. Eso hace tropezar a la gente en la primera línea, y también es una forma fiable de detectar código generado que nunca se ejecutó: si un fragmento hace import polymarket_client, nadie lo ha ejecutado.

Cuatro clientes: elige con criterio

ClienteDatos públicosTradingTiempo realÚsalo para
AsyncPublicClientSíNoSíBots, recolectores de datos
AsyncSecureClientSíSíSíBots de trading
PublicClientSíNoNoScripts, notebooks
SecureClientSíSíNoScripts que operan

El tiempo real es solo asíncrono

PublicClient y SecureClient no implementan subscribe(). Si piensas recibir actualizaciones del libro por streaming (y cualquier bot serio debería), necesitas uno de los clientes asíncronos. Elegir pronto un cliente síncrono y descubrir esto más tarde supone una refactorización molesta.

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())

Los datos públicos no requieren credenciales, así que construye y prueba todo lo que puedas contra AsyncPublicClient antes de introducir una clave. El descubrimiento, el parsing, la paginación, la generación de señales y el backoff se pueden ejercitar sin nada en riesgo.

Paginación

Una sola interfaz de paginador para todos los métodos de listado. Tres formas de consumirlo, según te importen o no los límites de página:

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 es opaco, así que guárdalo tal cual

No analices, decodifiques ni construyas cursores. Guarda el string tal cual si quieres reanudar más tarde un recorrido largo, y omítelo para empezar desde el principio. Construir tu propio cursor es de esas cosas que funcionan hasta que cambia la codificación.

Modelos tipados

Los métodos devuelven tipos reales en lugar de diccionarios, exportados desde el paquete de nivel superior:

from polymarket import Event, Market, OrderBook, PriceHistoryPoint

Es la mejora menos vistosa y probablemente la más valiosa. Con los clientes antiguos, un campo renombrado o ausente aparecía como un KeyError en lo más profundo del bucle de tu estrategia en tiempo de ejecución, a menudo en producción y a menudo con una posición abierta. Los modelos tipados llevan ese fallo a donde le corresponde.

Suscripciones en tiempo real

subscribe() combina varios feeds en un único stream de eventos tipados, una mejora real frente a gestionar a mano varias conexiones WebSocket.

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)

El SDK se encarga del heartbeat, el framing y las reconexiones que de otro modo implementarías tú, incluido el requisito de enviar PING cada 10 segundos en una conexión directa. Detalles en la guía de WebSocket.

Colocar una orden

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 es gasto, no tamaño

place_market_order(amount="10") significa gastar hasta 10 pUSD, no comprar 10 acciones. En un contrato que cotiza a 0.20 son aproximadamente 50 acciones. Malinterpretarlo es una forma fácil de abrir una posición cinco veces mayor de lo previsto.

Migrar desde py-clob-client

  1. Haz inventario de todas las llamadas a Polymarket, incluidas las llamadas requests directas a Gamma y a la Data API. También entran en el alcance: el SDK unificado las cubre, e integrarlas es la mayor parte del beneficio.
  2. Instala polymarket-client y elimina los paquetes antiguos. Mantener ambos instalados para migrar poco a poco invita a importar el símbolo client equivocado.
  3. Sustituye la construcción del cliente. Un único AsyncSecureClient.create(...) reemplaza los antiguos clientes por servicio y su gestión separada de credenciales.
  4. Sustituye el acceso por diccionario por acceso a atributos. market["condition_id"] pasa a ser market.condition_id. Es tedioso, y es donde el type checker empieza a amortizarse.
  5. Reescribe la paginación con la interfaz del paginador en lugar de bucles manuales con offset o cursor.
  6. Sustituye el código WebSocket hecho a mano por subscribe() y elimina tu lógica de heartbeat y reconexión.
  7. Vuelve a ejecutar primero tus rutas de solo lectura, contra el cliente público, antes de dejar que nada coloque una orden.

TypeScript incluye adaptadores de firmante

El SDK de TypeScript incluye adaptadores para Viem, Privy y Ethers v5, así que conectas tu biblioteca de wallet existente en lugar de implementar una firma específica del CLOB. Si mantenías un firmante propio sobre el antiguo paquete builder-signing, ahora puedes borrar ese código.

Por qué tu asistente de IA se equivoca con esto

Vale la pena abordarlo directamente, porque así llega aquí mucha gente. Pide a un LLM código de Polymarket en Python y muy a menudo obtendrás imports de py_clob_client, construcción de ClobClient(...) y objetos OrderArgs. El modelo no está fallando: está reproduciendo la inmensa mayoría del código de Polymarket que ha visto, que es anterior a los SDK unificados.

  • Mira primero la línea del import. from polymarket import ... es lo actual; from py_clob_client... no.
  • Pega la documentación actual en el contexto. Polymarket publica Markdown legible por máquinas en docs.polymarket.com/llms.txt, y cada página tiene una variante .md. Darle al modelo lo auténtico funciona mejor que discutir con él.
  • Desconfía del código seguro de sí mismo que no se ejecuta. El código generado mezcla con frecuencia APIs antiguas y nuevas en algo que nunca ha existido.

El mismo problema se aplica a los proveedores de datos. Publicamos llms.txt, llms-full.txt y una especificación OpenAPI, y permitimos los crawlers de IA, precisamente para que los asistentes puedan escribir integraciones correctas con PolyTest sin adivinar. Algunos proveedores bloquean esos crawlers, lo cual es una decisión legítima, pero significa que tu asistente improvisará su API.

Lo que el SDK sigue sin poder hacer

El SDK unificado es una interfaz mucho mejor para las APIs de Polymarket. No cambia lo que contienen esas APIs, y lo que más suelen querer quienes crean bots no está en ellas.

No hay libro de órdenes histórico. client.get_market() devolverá los metadatos de un mercado resuelto, pero su libro ya no existe: /book devuelve 404 y prices-history solo conserva aproximadamente un punto por minuto. Ningún método del SDK, plan o credencial recupera el libro.

Para hacer backtesting necesitas snapshots grabados mientras los mercados estaban activos. PolyTest los ofrece para los mercados cripto Up/Down: 240M+ snapshots puntuales, 8 niveles de profundidad por lado, marcas de tiempo por debajo del segundo y mercados resueltos conservados. Es una API REST normal con una cabecera X-API-Key, así que encaja en el mismo código asíncrono junto al SDK. Empieza gratis o lee cómo crear un bot para ver el recorrido completo.

Preguntas frecuentes

¿Cuál es el SDK oficial de Python de Polymarket en 2026?
El SDK oficial de Python es polymarket-client, que se instala con pip install polymarket-client y se importa como polymarket. Es el SDK unificado que cubre las APIs CLOB, Gamma y Data, además de los streams en tiempo real, con una sola interfaz de cliente, y sustituye a py-clob-client. El equivalente en TypeScript es @polymarket/client, y hay un SDK unificado de Rust en desarrollo.
¿py-clob-client está obsoleto?
Ha sido sustituido por el SDK unificado polymarket-client, junto con los paquetes de TypeScript @polymarket/clob-client-v2, @polymarket/builder-relayer-client y @polymarket/builder-signing-sdk. Polymarket publica una guía de migración para trasladar las integraciones existentes. La mayoría de los tutoriales y del código generado por IA siguen haciendo referencia a los paquetes antiguos porque son muy anteriores a los SDK unificados.
¿Qué cliente de Python de Polymarket debo usar para un bot de trading?
Usa AsyncSecureClient. Hay cuatro clientes: AsyncPublicClient y PublicClient para datos públicos, y AsyncSecureClient y SecureClient para trading y acceso a la cuenta. Las suscripciones en tiempo real son solo asíncronas (los clientes síncronos no implementan subscribe()), así que cualquier bot que reciba actualizaciones del libro por streaming necesita un cliente asíncrono. Construye y prueba contra AsyncPublicClient antes de introducir credenciales.
¿Cómo pagino resultados con el SDK de Python de Polymarket?
Los métodos de listado devuelven un paginador. Recórrelo directamente para controlar página a página, llama a iter_items() para recorrer registros individuales sin preocuparte de los límites de página, o usa first_page() y from_cursor() para recorridos manuales que se pueden reanudar. El valor de next_cursor es opaco, así que guárdalo tal cual en lugar de analizarlo o construir uno, y omítelo para empezar desde la primera página.
¿Por qué ChatGPT o Claude generan código de Polymarket que no funciona?
Como la inmensa mayoría del código de Polymarket de los datos de entrenamiento es anterior a los SDK unificados, los modelos tienden a producir imports de py_clob_client, construcción de ClobClient y objetos OrderArgs. Mira primero la línea del import: from polymarket import es lo actual, from py_clob_client no. Polymarket publica documentación legible por máquinas en docs.polymarket.com/llms.txt y una variante .md de cada página, así que pegar la documentación actual en el contexto es más eficaz que corregir al modelo una y otra vez.
¿El SDK de Polymarket puede obtener datos históricos del libro de órdenes?
No. El SDK es una interfaz a las APIs de Polymarket y no puede devolver datos que esas APIs no guardan. Los metadatos de un mercado resuelto se pueden recuperar, pero su libro de órdenes devuelve 404 y su historial de precios solo conserva aproximadamente un punto por minuto. El backtesting requiere snapshots puntuales grabados por un tercero mientras los mercados estaban activos.

Obtén los datos históricos que Polymarket no guarda

PolyTest registra los mercados cripto Up/Down de Polymarket mientras están activos: 240M+ snapshots con 8 niveles de profundidad del libro de órdenes, marcas de tiempo por debajo del segundo y mercados resueltos conservados. Empieza con una prueba gratuita de 3 días.

Sigue leyendo