Una API de futuros en paper trading con precios reales en vivo. Tu bot abre posiciones apalancadas, deja órdenes límite y stop pendientes, mueve sus trailing stops y se liquida - todo se resuelve en nuestros servidores, en dólares simulados. El mismo código que vas a usar en real, sin ninguna de las consecuencias.
Sin tarjeta, sin KYC y sin depósito. Gratis para siempre a 120 peticiones por minuto: Pro cuesta $29 cuando un bot se convierte en cuatro. Los datos de mercado siguen sin clave en todos los planes.
# no key needed - run this right now curl "https://marginpad.io/api/bot/v1/price?symbol=BTC" { "symbol": "BTC", "price": …, "ts": … }
curl -X POST ".../v1/open" -H "X-API-Key: mpb_…" \ -d '{"symbol":"BTC","side":"long","margin_usd":100, "leverage":10,"trail_pct":1.5}' { "ok": true, "position": { "id": "bot_9f21…", "entry": …, "liq_price": …, "trail_pct": 1.5, "fee_round_trip_usd": 1.10 } }
La primera no necesita ninguna clave - pégala en una terminal antes de decidir nada. Cada ruta de abajo existe en una v1 congelada y una v2 con envoltorio; elige una y no se va a mover bajo tus pies.
GET /v1/price y /v1/klines no requieren clave y tienen CORS habilitado. Hasta 1,000 velas por llamada, siete temporalidades, paginadas hacia atrás con &end= para tanto historial como necesite un backtest.
POST /v1/open ejecuta al precio en vivo con margen aislado y te devuelve el nivel de liquidación. Añade type:"limit" o "stop" para dejar una orden pendiente en el servidor, o dry_run para cotizar una operación sin escribir nada.
Los stops, los objetivos, los trailing stops y las liquidaciones se liquidan de nuestro lado, sobre velas de 1 minuto, esté tu bot corriendo o no. Abre el WebSocket y el resultado te llega en unos dos segundos: es gratis en todos los planes, y es la diferencia entre un bot que reacciona y uno que espera a su siguiente vuelta.
# price (no key)
curl "https://marginpad.io/api/bot/v1/price?symbol=SOL"
# open a 20x long with $100 margin
curl -X POST "https://marginpad.io/api/bot/v1/open" \
-H "X-API-Key: YOUR_KEY" -H "Content-Type: application/json" \
-d '{"symbol":"SOL","side":"long","margin_usd":100,"leverage":20}'
# check live P&L
curl "https://marginpad.io/api/bot/v1/positions" -H "X-API-Key: YOUR_KEY"
# close half, let the rest run
curl -X POST "https://marginpad.io/api/bot/v1/close" \
-H "X-API-Key: YOUR_KEY" -H "Content-Type: application/json" \
-d '{"id":"POSITION_ID","pct":50}'
# the whole loop, without a single poll
const { MarginPad } = require("marginpad");
const mp = new MarginPad("YOUR_KEY");
mp.stream(ev => {
if (ev.type === "snapshot") console.log("open now:", ev.data.positions.length);
if (ev.type === "position") {
const p = ev.data.position; // opened | updated | closed
console.log(ev.data.event, p.symbol, p.pnl_usd ?? p.unrealized_pnl_usd);
if (ev.data.event === "closed") decideWhatIsNext(p);
}
});
# or with nothing but a URL - any language with a WebSocket client
wscat -c "wss://marginpad.io/api/bot/v2/stream?api_key=mpb_..."
<- {"type":"welcome","data":{"channels":["positions","prices"],"tick_ms":2000}}
<- {"type":"snapshot","data":{"positions":[...]}}
<- {"type":"position","data":{"event":"closed","position":{...,"pnl_usd":-1.24}}}
Medido, y por eso existe esta pestaña: el 99.4% de todas las llamadas que ha recibido esta API han sido sondeos de /positions o /account, y el WebSocket se había abierto seis veces. El stream es gratis en todos los planes a propósito: ponerlo detrás de un muro empujaría a todo el mundo de vuelta al sondeo, que nos cuesta más que el stream. Si tienes que sondear, devuelve el ETag: un sondeo sin cambios te cuesta entonces un 304 con el cuerpo vacío.
# python - the official client, zero dependencies
pip install marginpad
from marginpad import MarginPad
mp = MarginPad("YOUR_KEY")
price = mp.price("BTC")["price"]
if my_signal(price): # your strategy here
r = mp.open("BTC", "long", margin_usd=50, leverage=10,
sl=price * 0.97, trail_pct=1.5, # trailing stop, ratcheted server-side
client_order_id=f"sig-{int(time.time())}") # a retry can never open twice
print("opened", r["position"]["id"], "liq @", r["position"]["liq_price"])
changed = mp.positions(status="open") # None when nothing changed (ETag / 304)
print(mp.report()["skill"])
# node.js - the official client, zero dependencies
npm install marginpad
const { MarginPad } = require("marginpad");
const mp = new MarginPad("YOUR_KEY");
const { price } = await mp.price("ETH");
if (mySignal(price)) { // your strategy here
const { position } = await mp.open({ symbol: "ETH", side: "short", margin_usd: 50, leverage: 10,
trail_pct: 2, client_order_id: "sig-" + Date.now() });
console.log("opened", position.id, "liq @", position.liq_price);
}
mp.stream(ev => { if (ev.type === "position") console.log(ev.data.event, ev.data.position.id); });
# plain HTTP, any language
import requests
API = "https://marginpad.io/api/bot"; H = {"X-API-Key": "YOUR_KEY"}
r = requests.post(f"{API}/v2/open", headers=H, json={"symbol": "BTC", "side": "long",
"margin_usd": 50, "leverage": 10, "dry_run": True}).json() # priced, nothing written
print(r["data"]["position"]["fee_round_trip_usd"], r["data"]["position"]["liq_price"])
Autentícate con X-API-Key en cada llamada excepto /price, /klines y /time. Clientes oficiales, cero dependencias - npm install marginpad o pip install marginpad, o un solo archivo cada uno: marginpad.py · marginpad.js - REST, WebSocket, sondeo con ETag, reintento tras 429 y verificación de firma de webhook ya incluidos.
Inicia sesión con un correo - sin contraseña, sin KYC. Las posiciones de tu bot persisten en tu cuenta, y una cuenta puede tener varias claves para que un bot de backtest y un bot en vivo nunca compartan el mismo límite de peticiones.
| Nombre | Libro | Clave | Llamadas | Último uso |
|---|
Tus claves, su uso y el book que opera cada una aparecen aquí en cuanto inicias sesión. Las claves son secretas - cualquiera que tenga una puede operar tu cuenta de paper trading.
Los libros de órdenes de las testnets son poco profundos, sus precios se alejan del mercado real, y se reinician sin aviso. Aquí todo se cotiza con el feed multi-exchange en vivo sobre el que corren nuestros propios gráficos - solo los dólares son simulados.
Las entradas límite, las entradas stop, los stop-loss, los objetivos y los trailing stops se evalúan todos de nuestro lado contra velas de 1 minuto. Tu bot puede estar offline, reiniciándose o siendo redesplegado y la ejecución igual cae en tu nivel, marcada con el minuto en que el mercado realmente lo alcanzó.
Ambas patas pagan una comisión taker, cobrada como ida y vuelta al cerrar, con el funding acumulado entre marcas. Indica un exchange y la cuenta de paper trading se cobra según la tabla publicada de ese exchange menos nuestro descuento por referido - así que una estrategia de scalping falla aquí por la misma razón que fallaría allá.
Margen aislado, 0.5% de mantenimiento, pérdidas limitadas a tu margen. Un trailing stop se mueve con el extremo de cada vela después de que esa vela se comprobó contra el stop vigente - así una barra nunca puede sacarte en un nivel que ella misma creó.
Envía client_order_id y un reintento de apertura devuelve la posición que creó la primera llamada, marcada como idempotent: true. Cerrar también acepta uno. Este único campo es la diferencia entre un bot en el que confías sin vigilarlo y uno que tienes que vigilar de cerca.
Un WebSocket gratis empuja eventos de posiciones y marcas cada ~2 s; los webhooks envían la misma forma por POST a tu propia URL, firmados con HMAC y con reintentos, incluso cuando nada tuyo está conectado. Los ETag hacen que las peticiones que sigas haciendo salgan casi gratis.
Cada book tiene su propio diario, curva de equity y drawdown. /v1/report devuelve la tasa de acierto y el retorno por moneda, franja de apalancamiento, lado y hora, con un skill score - y no dice nada por debajo de ocho operaciones en lugar de inventar un patrón.
Toda cuenta empieza en Free y tiene el producto completo: el motor de trading, comisiones reales de exchanges, entradas límite y stop, trailing stops, replay, books, el stream de WebSocket y todos los datos de mercado sin clave. Los planes de pago suben los límites y añaden dos cosas - webhooks y lecturas de mercado con IA. No se retiene nada más.
Construye y haz correr un bot de verdad sin pagar nada.
Para un bot que corre sin supervisión, y para comparar estrategias en vez de adivinar entre ellas.
/v1/aiPara una flota - una familia de estrategias, cada una con su propio libro, ejecutándose al mismo tiempo.
Para una app o una mesa que opera en nombre de sus propios usuarios - una clave cada uno, un libro cada uno.
Medido en todas las claves de esta API durante las últimas dos semanas: el bot más activo en producción está en 46 peticiones por minuto - el 38% de lo que ya permite el plan Free - y ninguna clave ha sido limitada jamás, en ningún plan. Si estás elegiendo entre estos, elige según los libros, los webhooks y el historial, que es lo que realmente se agota. La capacidad está ahí cuando la necesitas. La mayoría de los bots nunca la tocan.
| Lo que cambia con el plan | Free | Pro · $29 | Max · $79 | Business · $159 |
|---|---|---|---|---|
API de datos de mercado (/api/v1/*) con tu clave60 / min por IP sin clave, en todos los planes | 120 / min | 600 / min | 2000 / min | 5000 / min |
| Claves de API por cuenta | 3 | 10 | 30 | 100 |
| Posiciones abiertas a la vez | 50 | 200 | 500 | 1000 |
| Libros - un diario, saldo e informe separados por estrategia el límite que la mayoría realmente alcanza | 1 | 5 | 20 | 50 |
| Webhooks - firmados, con reintentos, entregados aunque estés desconectado | ninguno | 3 | 15 | 50 |
Lectura de mercado con IA /v1/ai | ninguno | 50 al día | 200 al día | 500 al día |
| Historial de operaciones guardado lo que /v1/trades, el report y la curva de equity todavía pueden ver | 30 días | 90 días | 90 días | 90 días |
| Peticiones por minuto, por clave medido: el bot en producción más activo usa 46, y nunca se ha limitado nada | 120 | 600 | 2000 | 5000 |
Trading report /v1/report | totales + skill score hasta 30 días atrás | + desgloses y hallazgos hasta 90 días atrás | + desgloses y hallazgos | + desgloses y hallazgos |
En todos los planes, Free incluido: el motor de trading completo - órdenes market, limit y stop, trailing stops, cierres parciales, dry run y replay -, el stream por WebSocket, el servidor MCP, las tarifas de 9 exchanges reales, de $1 a $100,000 de margen por operación con hasta 1000× de apalancamiento, y todos los endpoints de datos de mercado sin clave a máxima velocidad. Los planes de pago mueven los topes. No desbloquean el producto.
Premium es otro producto. Una suscripción a MarginPad Premium desbloquea funciones del sitio web - los indicadores de gráfico exclusivos, el mapa de calor de liquidaciones, Ask-AI en los gráficos - y desde el 15 de septiembre de 2026 no cambia ni un solo límite de la API. Estos planes tampoco desbloquean aquellas funciones del sitio. Compra el que de verdad vayas a usar.
Los planes son mes a mes, pagados en cripto o directamente desde tu saldo de recompensas de MarginPad, y un mes comprado antes de tiempo se suma al que ya tienes en vez de reemplazarlo. Tus límites en vivo siempre están en GET /api/bot/v1/usage - limits, features, plan_until - para que un bot los pueda leer en vez de adivinar.
Lo que estás comprando, por escrito. La sección 9 de los términos cubre la API por su cuenta: qué incluye un plan y qué pasa el día en que termina, que nada se renueva automáticamente y que no hay nada que cancelar, a qué nos comprometemos y a qué no en materia de disponibilidad (no hay SLA - lo decimos así, y decimos a qué nos comprometemos en su lugar), treinta días de aviso antes de cualquier cambio incompatible, y que puedes construir y vender productos comerciales sobre esta API sin pedirnos permiso.
A tu bot se le avisa antes de que caduque el plan, no después. Cada respuesta con clave lleva X-MP-Plan, y en los últimos catorce días lleva además X-MP-Plan-Expires y X-MP-Plan-Days-Left. Regístralos y un bot desatendido puede avisarte él mismo; la misma cuenta atrás está en esta página y en /v1/usage. Un plan que se agota baja la clave a Free: nunca deja de responder.
Veinticuatro en total. Todo es JSON sobre HTTPS, con CORS activado y una sola cabecera. Cambia v1 por v2 en cualquier ruta para obtener el sobre {ok,data,ts}.
&end=<unix ms> para paginar más atrás.asset_class, max_leverage y taker_fee_pct por símbolo. Filtra con ?class=crypto|stock|forex|metal|index. Llama esto una vez al iniciar en lugar de descubrir los límites a prueba y error.drift_ms de vuelta. Un bot que agrupa velas contra un reloj local desincronizado construye barras que nadie más ve, y eso es un infierno de depurar desde afuera.bars = get(f"/api/bot/v1/klines?symbol=BTC&interval=1")
while len(all_bars) < wanted:
end_ms = bars[0]["time"] * 1000 # oldest candle in hand
bars = get(f"/api/bot/v1/klines?symbol=BTC&interval=1&end={end_ms}")
if not bars: break
all_bars = bars + all_bars
{"symbol":"BTC","side":"long","margin_usd":100,"leverage":20,"sl":58000,"tp":66000} (sl/tp opcionales). Devuelve la posición, incl. su liq_price. Añade "dry_run":true para recibir la operación cotizada - entrada, cantidad, precio de liquidación y distancia, la comisión de apertura y la ida y vuelta completa - sin escribir nada. Usa el dry run para dimensionar una posición o para probar tu bot contra el motor real.trail_pct fija un stop que sigue el mejor precio visto desde la entrada a esa distancia porcentual, ajustado en el servidor: desde los extremos de la vela de 1 minuto en el barrido de cada minuto y desde el precio en vivo en cada lectura de /positions, así que sigue moviéndose mientras tu bot está offline y nunca se afloja. Un long abierto en 60,000 con trail_pct: 1 empieza con su stop en 59,400; cuando el precio marca 63,000, el stop queda en 62,370. Las posiciones llevan trail_pct y trail_hwm.{"symbol":"BTC","side":"long","type":"limit","limit_price":58000,"margin_usd":100,"leverage":20}. Se ejecuta a tu precio, no al precio en que el motor notó el cruce - la ejecución se busca en el máximo/mínimo de 1m, así que una mecha que retrocedió entre dos revisiones igual cuenta. Tu bot no tiene que estar corriendo. Un limit long debe estar por debajo del mercado y un limit short por encima; si no, obtienes limit_marketable en vez de una ejecución silenciosa a mercado.{"symbol":"BTC","side":"long","type":"stop","limit_price":66000,"margin_usd":100,"leverage":10}. Mismo motor que una orden límite - se ejecuta en el nivel a partir de velas de 1m, con el navegador cerrado - pero el lado incorrecto se rechaza (stop_wrong_side) para que un stop y un límite nunca se confundan. sl, tp, trail_pct, client_order_id y dry_run aplican todos.{"id":"bp...","pct":50} - pct es opcional (100 por defecto); los cierres parciales dividen la posición exactamente igual que en el sitio.{"id":"bot...","sl":63500,"tp":66000,"trail_pct":1.5} - envía null para borrar uno, omite un campo para mantenerlo. Los niveles se comprueban según el lado de la entrada. Antes de que existiera esto tenías que cerrar y reabrir para mover un stop, lo que cambiaba tu entrada y pagaba una ida y vuelta completa.type: "limit" | "stop", más las últimas 20 que se ejecutaron, expiraron o se cancelaron - una ejecutada lleva el position_id que creó. Las órdenes son válidas hasta que se cancelan, expiran a los 30 días, y pueden quedar 20 pendientes por cuenta.{"order_id":"lo...","limit_price":58500,"sl":57000,"tp":62000,"margin_usd":150,"leverage":10,"trail_pct":1} - envía solo lo que cambia. Antes de esto la única forma era cancelar y volver a crearla, lo que perdía el client_order_id de la orden. La dirección ahora se recalcula a partir del mercado y la marca de vela se reinicia, así que un nivel movido nunca puede ejecutarse en una barra impresa antes del cambio. Una orden ejecutada, cancelada o expirada responde 409.{"order_id":"lo..."}. Si ya se ejecutó o se canceló, responde 409, así que un reintento nunca puede deshacer una ejecución.mark_price y unrealized_pnl_usd en vivo; las liquidaciones y el SL/TP alcanzados se resuelven automáticamente. ?status=open|closed recorta el body a lo que tu loop realmente lee; también se admiten ?since=<unix ms> e If-None-Match (304 cuando nada cambió).balance_usd, equity_usd, free_margin_usd y return_pct./account cuando eso es todo lo que necesita tu lógica de tamaño de posición./positions está limitado a 100 filas; este pagina por toda la ventana de retención - sigue next_before hasta que vuelva null. Úsalo para calcular estadísticas de la estrategia sobre el registro completo en vez de una cola truncada.max_drawdown_pct y el punto no realizado en vivo al final.{"confirm":true}: los cierres se archivan, las órdenes se cancelan. Se rechaza con 409 open_positions_exist mientras haya algo abierto.usage_30d - llamadas por día por endpoint más refused (los 429), para que un bot pueda ver qué tan cerca corre de su límite.POST {"venue":"bybit"} fija el valor por defecto de la cuenta; fee_venue en /open lo anula para una posición. Ver comisiones por exchange.locked[] indica qué se retiene). Cada hallazgo lleva el n en el que se apoya y no dice nada por debajo de 8 operaciones.{"symbol":"BTC","interval":"60","question":"Is this leaning long or short?"}. Mismo modelo, mismo prompt y la misma cuota de 50 al día que Ask-AI en el sitio. Recibes la answer, un plan analizado (sesgo, entrada, stop, objetivos) cuando el modelo vio un setup, y el brief sobre el que razonó - precio, movimiento, máximo/mínimo del swing, medias móviles, RSI, ATR, Bollinger, cierres recientes - para que puedas registrar exactamente qué miró. Educativo, no es asesoría financiera.POST {"act":"add","url":"https://…"} registra uno, {"act":"test","id":…} envía un ping y devuelve el estado que respondió tu servidor, {"act":"delete","id":…} lo elimina.Legible por máquina: especificación OpenAPI 3.1 con los esquemas completos de petición y respuesta · una referencia interactiva desde la que puedes disparar llamadas · el changelog (JSON).
Las órdenes se ejecutan al instante al precio real en vivo (feed multi-exchange - los mismos precios que nuestro Paper Trade). Las ejecuciones vía API no tienen slippage (las del sitio web sí), así que trata los precios de entrada como algo optimistas.
Cada posición paga una comisión taker en ambos lados, que se liquida en pnl_usd al cerrar. Se cobra como un viaje redondo: fee = qty × (entry + exit) × rate. El funding se acumula en posiciones mantenidas a través de las marcas de funding y se descuenta de la misma manera. Las posiciones abiertas ya muestran el P&L neto del viaje redondo en unrealized_pnl_usd, así que lo que ves es lo que se liquida.
| Mercado | Comisión por lado | Viaje redondo sobre un nocional de $10,000 |
|---|---|---|
| Perpetuos de cripto | 0.055% | $11.00 |
| Acciones y ETFs | 0.02% | $4.00 |
| Metales e índices | 0.015% | $3.00 |
| Pares principales de forex | 0.008% | $1.60 |
¿Prefieres la factura exacta del exchange en el que vas a operar? Cobra a la cuenta simulada según su tarifario, descuento por referido incluido. Por encima de unas 180× de apalancamiento, la tasa se reduce para que el viaje redondo nunca supere el 20% de tu margen. GET /v1/markets devuelve la tasa exacta y el tope de apalancamiento de cada símbolo. Las estrategias de horizonte corto viven o mueren por este número - un scalp que gana menos que el viaje redondo es una pérdida sin importar cuántas veces acierte.
Margen aislado. Las pérdidas están limitadas a tu margen. El precio de liquidación usa una tasa de margen de mantenimiento del 0.5%; cuando el precio en vivo lo cruza, la posición se liquida automáticamente al precio de liquidación. Las órdenes de stop-loss y take-profit también se ejecutan automáticamente - cuando el precio cruza tu sl o tu tp (verificado contra las mechas de las velas de 1 minuto en el barrido por minuto, así que un pico que se retrajo igual cuenta), la posición se liquida a ese nivel. Un trailing stop avanza desde el mejor precio visto: en el barrido se mueve según el extremo de cada vela después de que esa vela ya fue verificada contra el stop vigente, así que una vela nunca puede sacarte a un nivel que ella misma creó.
Cada cuenta simulada empieza con un nominal de $10,000. /v1/account y /v1/balance reportan balance_usd, equity_usd y free_margin_usd para que puedas expresar los resultados como un rendimiento y no como una cifra en dólares sin más. Este saldo es un marcador, no una restricción: el margen no se le descuenta y una apertura nunca se rechaza por falta de fondos (margin_enforced: false). Dimensiona tus propias posiciones si quieres que la restricción sea real.
Cada respuesta lleva X-RateLimit-Limit, X-RateLimit-Remaining y X-RateLimit-Reset (segundos epoch); un 429 añade Retry-After. Los límites se cuentan por clave, así que una segunda clave tiene su propio presupuesto. X-RateLimit-Scope indica si se aplicó el límite de la clave o el de la IP.
Las posiciones abiertas vía la API viven en tu cuenta del lado del servidor, así que aparecen en Mis Operaciones, cuentan para las tablas de temporada y el XP, y alimentan tu informe de trading - el mismo informe que GET /v1/report devuelve al bot.
Ponerla detrás de un muro de pago empujaría a todos los demás de vuelta al polling, que nos cuesta mucho más que el stream - así que los incentivos se alinean: usa el WebSocket, ganamos los dos. Los datos de mercado siguen sin clave y gratis para siempre; una clave solo sube su límite.
Dos cosas en este motor son deliberadamente generosas, y es mejor nombrarlas que dejar que las descubras en una cuenta real. Una orden a mercado se ejecuta al precio en vivo, así que una posición nueva marca 0.00 de no realizado y la línea de entrada queda exactamente donde la pediste. Y el margen de mantenimiento es un 0.5% fijo, sin importar cuánto valga la posición. Para aprender a operar, ambas son la decisión correcta. Para poner a prueba una estrategia son optimistas, y cuanto mayor es el tamaño, más optimistas se vuelven.
Así que son interruptores, no supuestos fijos. Desactivados por defecto (nada de lo que ya construiste cambia) y, al activarlos, el precio de ejecución y el precio de liquidación se comportan como los haría comportarse un libro de órdenes real y una tabla de límites de riesgo real.
GET /api/bot/v2/realism // your setting, the venue table and the whole tier ladder
POST /api/bot/v2/realism {"slippage": true, "margin_tiers": true, "margin_venue": "binance"}
# or per call, so one strategy can be tested both ways without touching the account
POST /api/bot/v1/open {"symbol":"BTC","side":"long","margin_usd":100,"leverage":10,
"slippage": true, "margin_tiers": true, "mmr_pct": 0.4}
La ejecución se mueve en tu contra lo que cuesta recorrer un libro de órdenes real: 0.01% en las principales, 0.05% en criptomonedas menos líquidas, 0.005% en forex, 0.02% en acciones, metales e índices. Una compra paga de más, una venta vende de menos; nunca al revés.
El margen de mantenimiento sube con el tamaño nocional, igual que la tabla de límites de riesgo de un exchange, así que una posición grande se liquida antes: un requisito de mantenimiento más alto tolera menos movimiento en contra antes de cerrarte, que es justo lo que un exchange quiere para el tamaño grande. Este es nuestro modelo publicado y no la tabla de ningún exchange en particular, y GET /realism devuelve toda la escala; nunca deberías tener que deducirla a partir de un precio de liquidación.
La tasa de margen de mantenimiento publicada de qué exchange usar como base: Binance 0.40%, Bybit 0.50%, MEXC 0.10%, Kraken 0.60%, Hyperliquid 1.25%, Coinbase 1.33%. Esto mueve solo dónde se ubica el precio de liquidación, nunca el tamaño, las comisiones ni el P&L.
Una posición conserva el margen de mantenimiento con el que fue ejecutada, así que activar esto nunca reescribe una operación que ya tienes abierta, y cada cierre registra con qué se ejecutó. De ahí viene la columna Ejecuciones del arena: una tabla que clasifica bots debería decir cuáles jugaron en modo fácil.
Por defecto, cada ejecución simulada paga la tasa de MarginPad: 0.055% por lado en cripto, ambas piernas, cobradas como round trip al cierre. Eso es un promedio justo, pero no es la factura exacta de nadie. Si ya sabes dónde correrá el bot de verdad, cobra a la cuenta simulada según la tabla de ese exchange - su tasa taker publicada, menos el descuento de referido que consigue un registro de MarginPad allí - así el forward test se liquida como lo hará la cuenta real:
GET /api/bot/v2/fees // the table below + your current default
POST /api/bot/v2/fees {"venue":"hyperliquid"} // account default: every open from now on, site and API
POST /api/bot/v2/open {"symbol":"BTC","side":"long","margin_usd":100,"leverage":10,"fee_venue":"bybit"} // just this one
POST /api/bot/v2/open {..., "dry_run":true} // -> fee_venue, taker_fee_pct, fee_vs_marginpad_default_usd
| Plataforma | Taker | Nuestro descuento de referido | Pagas por lado |
|---|---|---|---|
| Bybit | 0.055% | 20% | 0.044% |
| Binance | 0.050% | 20% | 0.040% |
| Bitget | 0.060% | 20% | 0.048% |
| Gate | 0.050% | 20% | 0.040% |
| Hyperliquid | 0.045% | 4% (código MARGINPAD) | 0.0432% |
| OKX · Kraken | 0.050% | - | 0.050% |
| MEXC | 0.020% | - | 0.020% |
| KuCoin | 0.060% | - | 0.060% |
| Valor por defecto de MarginPad | sin exchange elegido | 0.055% | |
Las tasas son el nivel base publicado de los exchanges y los descuentos que indicamos en /exchanges/; la API las devuelve con source para que sepas que son cifras publicitadas, no mediciones. Ambas piernas pagan la tasa taker (el motor de paper trading ejecuta a mercado; no se modela un rebate de maker en una entrada pendiente). Solo perpetuos cripto - acciones, forex, metales e índices mantienen las tasas de la clase de MarginPad sea cual sea el exchange. Las posiciones abiertas mantienen la tasa con la que se ejecutaron; el límite de apalancamiento extremo (un round trip nunca por encima del 20% del margen) sigue aplicando. La misma opción es el selector "Fees as on" en el formulario de Paper Trade, así un bot y las operaciones manuales de su dueño pagan comisiones idénticas.
Envía siempre client_order_id al abrir. Esta es la línea más importante de toda esta documentación. Sin ella, una petición que expira en la red te deja adivinando: ¿se abrió la posición o no? Reintentas y puede que tengas dos. Con ella, el reintento devuelve la posición que creó la primera llamada, marcada como idempotent: true:
POST /api/bot/v2/open
{"symbol":"BTC","side":"long","margin_usd":100,"leverage":5,"client_order_id":"sig-2026-08-19-1403"}
// first call -> {"ok":true,"data":{"position":{"id":"bot...", ...}}}
// same call retried -> {"ok":true,"data":{"position":{"id":"bot...", ...},"idempotent":true}}
Usa un valor que tu estrategia pueda regenerar de forma determinista - un id de señal, o el símbolo más la marca de tiempo de la vela. Los ids se recuerdan durante 7 días.
Cerrar también acepta uno. Envía client_order_id en /close y un reintento reporta lo que hizo la primera llamada (idempotent: true) en vez de un error que tienes que interpretar.
Envía symbol al cerrar. Cada fila de /positions ya lo lleva, así que agregarlo no cuesta nada y acorta de forma medible el cierre:
POST /api/bot/v2/close
{"id":"bot...","symbol":"BTC"} // one price fetch, one round trip
{"id":"bot..."} // server must first look up which symbol to price
Nuestro almacén de trading es una única instancia fijada a una región, así que cada salto extra cuesta lo que cuesta el round trip hasta ella desde donde estés. Medido el 2026-08-19: cerca de 20 ms desde Europa pero 198 ms de mediana y 368 ms en el percentil 95 desde Singapur. Un feed de precio frío suma alrededor de 400 ms más, y sin la pista, un cierre en un par líquido podría terminar esperando a uno ilíquido en el mismo lote. Con la pista, un cierre es un salto más un precio ya en caché. Un symbol incorrecto o desactualizado no cuesta nada - el servidor lo nota y usa el respaldo.
No gastes tu presupuesto de peticiones en polling. La mayoría de los bots gastan el grueso de sus llamadas preguntando "¿cambió algo?". Dos cosas hacen que eso sea casi gratis:
# 1. state changes: send back the ETag, get 304 and an empty body when nothing moved
curl -H "X-API-Key: $KEY" -H 'If-None-Match: W/"1a2b3c-4"' \
https://marginpad.io/api/bot/v1/positions
# 2. live prices: /price is KEYLESS, so it costs nothing against your 120/min
curl https://marginpad.io/api/bot/v1/price?symbol=BTC
El ETag cubre el estado estructural - ids de posición, estado, cantidad, stop, objetivo, salida - y deliberadamente no el precio de referencia (mark price), que se mueve en cada tick y haría que el ETag nunca coincidiera. Así que: consulta /positions para saber "si saltó mi stop", y consulta el /price sin clave para el P&L. Vigila X-RateLimit-Remaining y reduce la frecuencia según Retry-After.
Las posiciones y los precios te llegan automáticamente (push), así te enteras de que tu stop saltó en un par de segundos, en vez de esperar a tu próxima consulta:
wss://marginpad.io/api/bot/v2/stream?api_key=mpb_…
<- {"type":"welcome","data":{"channels":["positions","prices"],"tick_ms":2000},"ts":…}
<- {"type":"snapshot","data":{"positions":[…]},"ts":…}
<- {"type":"position","data":{"event":"closed","position":{…,"pnl_usd":-1.24}},"ts":…}
<- {"type":"prices","data":{"BTC":64770.1},"ts":…}
-> {"op":"subscribe","channels":["positions"]} // prices off, events only
-> {"op":"ping"} // <- {"type":"pong"}
Eventos: position con event: opened | updated | closed se dispara cuando algo realmente cambia - una ejecución, un stop que se mueve, un cierre, una liquidación. prices lleva el precio de referencia de tus símbolos abiertos en cada tick. El simple movimiento del precio de referencia nunca genera un evento position, así que el canal permanece en silencio cuando no ha pasado nada.
Los stops se resuelven más rápido mientras estás conectado. El stream impulsa el mismo barrido de SL/TP/liquidación del lado del servidor que usa la vía REST, con su cadencia de ~2s, en lugar de dejar tu posición a merced del barrido periódico.
Hasta 3 sockets simultáneos por cuenta, compartidos entre tus claves. Los sockets se reciclan cada 6 horas - al reconectar recibes un snapshot nuevo. Si la conexión se cae, trata el siguiente snapshot como la verdad en lugar de intentar reproducir los eventos perdidos.
Medido antes de que esto existiera: el 89.5% de cada llamada a esta API era hacer polling a /positions y /account en busca de eventos. Un webhook invierte eso - te enviamos un POST cuando algo realmente ocurre, con la misma forma de Position que habría devuelto un poll, y funciona mientras tu bot está desconectado, reiniciando o desplegado en algún lugar que no puede mantener un socket.
POST /api/bot/v2/webhooks
{"act":"add","url":"https://bot.example.com/marginpad","events":["position.closed","position.liquidated","order.filled"]}
-> {"ok":true,"data":{"webhook":{"id":"wh…","secret":"whs_…","events":[…],"active":true}}}
# what arrives at your URL, seconds after the event:
POST https://bot.example.com/marginpad
X-MP-Event: position.closed X-MP-Delivery: 1841
X-MP-Timestamp: 1789124656008 X-MP-Signature: sha256=3763dc5d…
{"event":"position.closed","ts":1789124656008,"hook_id":"wh…","data":{"id":"bot…","symbol":"BTC","status":"closed","pnl_usd":-0.08,"close_reason":"SL hit",…}}
Eventos: position.opened · position.updated (un stop o un objetivo se movió) · position.closed · position.liquidated · order.filled (lleva la posición que creó) · order.expired · order.cancelled. Omite events para recibirlos todos. Las operaciones hechas en el sitio en la misma cuenta también los disparan.
Verifica cada entrega. X-MP-Signature es sha256=HMAC_SHA256(secret, raw body) con el secreto que se devuelve al añadir el hook. Compáralo antes de parsear el cuerpo; ambos SDK traen verify_webhook / verifyWebhook. Responde 2xx en menos de 6 segundos: cualquier otra cosa se reintenta 5 veces con espera creciente (30 s, 1, 2, 4 min), y un hook se pausa tras 25 fallos seguidos; GET /webhooks muestra active, consecutive_failures y last_error para que veas por qué. Tres hooks por cuenta en Pro, quince en Max y cincuenta en Business; las entregas son de mejor esfuerzo, y el snapshot del WebSocket y /positions siguen siendo la fuente de verdad.
Pruébalo antes de escribir un receptor: registra https://marginpad.io/api/whsink/<any-token-you-choose> como la URL, y luego abre GET en esa misma dirección - devuelve las últimas 20 entregas (headers y body) durante 15 minutos. Sin autenticación; el token es el secreto.
Un book es un diario, un balance, un report y una curva de equity separados dentro de tu cuenta. Crea una clave con el nombre de un book y cada llamada hecha con esa clave opera ese book; tu cuenta principal y tus otros books nunca lo ven. Las cuentas Free tienen un book además del principal, API Pro cinco, Max veinte y Business cincuenta.
POST /api/bot/key {"act":"create","name":"rsi bot","book":"rsi"} // key bound to the book "rsi"
GET /api/bot/v1/accounts // every book with lifetime numbers and its keys
GET /api/bot/v1/account // "account":"rsi" on a book key, "main" otherwise
POST /api/bot/v1/reset {"confirm":true} // this book back to $10,000: closes archived, orders cancelled
GET /api/bot/v1/equity?days=30&step_min=60 // equity curve + max_drawdown_pct
Reset se rechaza con 409 open_positions_exist mientras haya algo abierto: cierra primero, luego reinicia. Las operaciones archivadas se conservan (nunca se borran), pero el informe, el registro, /trades y la curva de equity empiezan desde el reset, y un navegador que aún tenga el diario antiguo no puede devolverlo. Los webhooks se disparan en los hooks de la cuenta con "account":"rsi" en el payload, así que un solo receptor sirve a todos los books.
Haz backtest con el mismo código que vas a correr en vivo. Inicia un replay de un día UTC pasado y las mismas rutas que tu bot ya llama actúan sobre un diario de replay separado, cotizado con las propias velas de 1 minuto de MarginPad en el cursor. Los stops, los objetivos y las liquidaciones se comprueban en cada vela entre dos de tus llamadas, sobre el máximo y el mínimo, con la misma matemática de comisiones y funding que en vivo. Nada de un replay llega a las tablas, a la arena o a tu informe.
POST /api/bot/v1/replay {"symbol":"BTC","day":"2026-09-11","speed":120} // 120 market seconds per real second: a day in 12 minutes
GET /api/bot/v1/replay?interval=5&bars=120 // cursor, price, progress, candles up to the cursor
POST /api/bot/v1/open {...} // acts on the replay book at the cursor price while the replay runs
POST /api/bot/v1/replay {"act":"stop"} // close at the cursor, get the summary, empty the replay journal
La velocidad va de 1 (tiempo real) a 600 (un día en 2.4 minutos). Un replay por clave a la vez, solo cripto, por ahora solo órdenes a mercado: lee el precio y las velas del replay desde GET /v1/replay, ya que el /v1/price y el /v1/klines sin clave siguen respondiendo datos en vivo.
Puedes tener varias claves en una cuenta - mantén separados un bot de backtest y un bot en vivo, y revoca uno sin tocar el otro. El uso y los límites de peticiones se cuentan por clave, así que cada una tiene su propio presupuesto y su propia línea en tus estadísticas. Con la sesión iniciada en el sitio, desde el navegador:
POST /api/bot/key {"act":"list"} // all your keys
POST /api/bot/key {"act":"create","name":"backtest-bot"} // new key
POST /api/bot/key {"act":"rename","key":"mpb_...","name":"live-bot"}
POST /api/bot/key {"act":"revoke","key":"mpb_..."} // usage history is kept
Una clave revocada devuelve 401 revoked_key. Las claves son secretas - cualquiera que tenga una puede operar tu cuenta de paper trading. Créalas y revócalas arriba de esta página.
Toda cuenta o libro con al menos cinco cierres abiertos a través de la API en esta temporada de 14 días queda clasificado en /arena/ por PnL realizado neto de comisiones y funding, con tasa de acierto, rendimiento sobre la tarjeta de $10,000, ROE promedio y liquidaciones. Sin premios y sin nada que registrar: opera a través de la API y la tabla te incluye sola. JSON: GET /api/arena.
MarginPad ejecuta un servidor remoto de MCP, así un asistente de IA puede leer los mercados y operar tu cuenta simulada directamente - sin código de conexión:
https://marginpad.io/mcp
Añádelo como servidor MCP remoto en tu cliente y pon el header X-API-Key: mpb_… si quieres las herramientas de paper trading. Las herramientas de datos de mercado no necesitan clave. Se exponen veintisiete herramientas: precios, velas, mercados, screener, funding, interés abierto, liquidaciones, fear and greed, el calendario económico, dos calculadoras, y apertura en paper (con trailing stops y dry run) / órdenes límite y stop / modificar / cancelar / cerrar / sltp / posiciones / órdenes / saldo / operaciones / informe / comisiones / cuentas / reset / equity / replay. GET /mcp en un navegador devuelve el descriptor del servidor.
/api/bot/v1/* está congelada. Sus cuerpos de respuesta no van a cambiar; los bots escritos contra ella siguen funcionando indefinidamente, y todavía recibe correcciones de errores.
/api/bot/v2/* es la misma API con el envoltorio que ya usan nuestros endpoints de datos - una sola forma predecible para el éxito y el fallo, para que escribas el parseo una sola vez:
{ "ok": true, "data": { ... }, "ts": 1787200000000 }
{ "ok": false, "error": { "code": "unknown_symbol", "message": "No price feed for that symbol...", "symbol": "FOO" }, "ts": 1787200000000 }
Mismas rutas, mismos parámetros, misma clave - cambia v1 por v2 en la URL. Los valores de code de error son identificadores estables; message es para humanos y puede reformularse.
En /v2, los fallos siempre tienen la forma {"ok":false,"error":{"code","message"},"ts"}. El code es un identificador estable sobre el que puedes ramificar tu lógica; el message es texto libre y puede cambiar de redacción. Algunos errores incluyen el valor que necesitas para corregir la llamada - sl_wrong_side y tp_wrong_side incluyen el precio en vivo.
| Código | HTTP | Qué hacer |
|---|---|---|
missing_api_key / invalid_api_key | 401 | Envía una clave válida en X-API-Key. |
revoked_key | 401 | Crea una clave nueva; esta fue revocada. |
rate_limit | 429 | Espera hasta Retry-After. No reintentes de inmediato. |
unknown_symbol | 404 | Consulta /v1/markets. |
symbol_required, margin_usd_min_1, margin_usd_max_100000, id_required | 400 | Corrige el cuerpo de la solicitud. |
sl_wrong_side / tp_wrong_side | 400 | La respuesta incluye live - coloca el nivel en el lado correcto de ese precio. |
stop_wrong_side | 400 | Una entrada stop espera del lado de la ruptura (long por arriba, short por abajo). Usa type:"limit" para una entrada en retroceso. |
trail_pct_invalid | 400 | trail_pct es un porcentaje entre 0.05 y 50; se rechaza, nunca se ajusta en silencio. |
nothing_to_modify | 400 | /modify_order necesita al menos un campo. |
plan_required | 402 | Los webhooks y /v1/ai necesitan un plan de pago. Todo lo demás de esta página está en Free. El cuerpo lleva plan_needed. |
premium_required | 402 | Código heredado de plan_required, que se sigue enviando para que un bot de la 2.3 lo reconozca. |
too_many_webhooks | 409 | Borra uno primero: tres hooks en Pro, quince en Max y cincuenta en Business. |
bad_url / bad_event | 400 | Las URLs de los webhooks deben ser https en un host público; los nombres de eventos están listados en GET /webhooks. |
ai_quota | 429 | Se usó la cuota diaria de IA (compartida con el sitio). Se reinicia a las 00:00 UTC. |
too_many_open | 409 | Estás en el límite de posiciones abiertas de tu plan. Cierra algo. |
already_closed | 400 | Inofensivo en un reintento - la posición ya está liquidada. |
no_price | 400 | No hay precio en vivo en este instante; la posición sigue abierta. Reintenta. |
unavailable | 503 | Transitorio. Reintenta con backoff. |
Liquidaciones en tiempo real agregadas de Binance, Bybit, OKX, BitMEX, Hyperliquid y Bitfinex - los datos detrás de nuestro feed Rekt y del Mapa de Calor de Liquidaciones, expuestos como JSON gratis. En otros lugares, datos comparables suelen estar detrás de un muro de pago de $300+/mes; aquí no hace falta ninguna clave API. Con caché en el edge y límite de peticiones, así que soporta sin problema a los bots que hacen polling.
{events:[{ts, exchange, symbol, side, price, qty, notional}]}. Los eventos llegan aquí segundos después de que ocurren (caché de borde de 3s). Haz polling cada 3-5s.side es long_liquidated o short_liquidated, notional es el tamaño en USD.minutes: hasta 43200 (30 días).{clusters:[{price, side, est_notional}]}. Se actualiza continuamente a partir del flujo de órdenes en vivo.Se agradece la atribución (enlaza marginpad.io) pero no es obligatoria. La cobertura es ~70%+ del flujo de liquidaciones del mercado - los exchanges que mueven el precio. Uso educativo; sin SLA de uptime. ¿Solo quieres datos de mercado? Toda la superficie sin clave está documentada en la página de API gratis de datos cripto.
La mayoría de los bots de trading de cripto que parecen rentables en un backtest pierden dinero la primera semana que salen en vivo. Los backtests repiten velas históricas limpias: no detectan una condición de carrera en tu lógica de órdenes, un error de tamaño de posición que solo aparece tras una racha de pérdidas, ni un apalancamiento que crece en silencio más allá de lo que tu margen aguanta. El forward testing ejecuta el mismo bot, el mismo código, contra precios reales en vivo y en tiempo real. Si la estrategia tiene un fallo, aparece aquí, donde un error no te cuesta nada.
| Backtesting | Paper trading (esta API) | Trading en vivo | |
|---|---|---|---|
| Precios | Velas históricas | Precios reales en vivo, en tiempo real | Precios reales en vivo |
| Riesgo | Ninguna | Ninguno - dólares simulados | Dinero real en juego |
| Detecta errores de lógica | Rara vez - los datos reproducidos los ocultan | Sí - el mismo código que en vivo | Sí, pero cada error cuesta dinero |
| Control de sobreajuste | No - ajustaste la estrategia con estos mismos datos | Sí - datos futuros nunca vistos | Sí |
| Costo | Gratis | Gratis - comisiones & funding simulados | Comisiones + pérdidas + funding |
| Ideal para | Descartar ideas rápido | Poner a prueba el bot antes de financiarlo | Una estrategia ya probada dos veces |
El paso intermedio es el que la mayoría se salta, y el que les habría salvado. Haz backtest de una idea aquí, pruébala en forward testing con esta API y luego financia una cuenta.
Todo en esta página se liquida en dólares simulados. Una vez que el bot ha sobrevivido semanas de forward testing, ese mismo código necesita una API de exchange para colocar órdenes reales. Recomendamos a quienes construyen bots dos exchanges, por razones distintas:
Perpetuos en su propia cadena con una API REST y WebSocket pública, sub-cuentas que tienen cada una su propia wallet de API (el bot nunca tiene tu clave principal), funding cada hora y un libro de órdenes que cualquiera puede auditar on-chain. Lo más parecido a correr contra esta API pero con dinero real.
Formatos de REST y WebSocket parecidos a lo que acabas de escribir, una clave separada por sub-cuenta, y uno de los feeds de donde vienen nuestros propios precios. La opción por defecto cuando quieres un libro de órdenes centralizado con rampas de entrada en fiat.
Abrir una cuenta en Bybit →Sí - MarginPad expone liquidaciones en tiempo real agregadas de 9 exchanges como JSON gratis, sin necesidad de clave: /api/v1/feed, /api/v1/liquidations/live, /api/v1/liquidations/recent y /api/v1/clusters. Los feeds comparables suelen costar $300+/mes. Consulta la sección de datos de liquidaciones.
Sí. Es un simulador de paper trading: las posiciones usan precios reales del mercado en vivo, pero sin dinero real. Inicia sesión con un email, genera una clave API y empieza a probar de inmediato. Los planes de pago solo elevan los límites.
Cualquier lenguaje que pueda hacer una petición HTTPS: Python, JavaScript/Node.js, Go, Rust, PHP o curl a secas. REST estándar, respuestas JSON, un único header X-API-Key.
Cualquier par USDT con precio en vivo en los principales exchanges: BTC, ETH, SOL y cientos de altcoins, además de acciones de EE. UU., pares forex principales, metales e índices como perpetuos. Comprueba un símbolo con GET /api/bot/v1/price?symbol=SOL.
No. Sin depósito, sin wallet, sin KYC. Solo inicias sesión con un correo para que tu clave API y tus posiciones persistan entre sesiones.
No. La Bot API tiene sus propios planes y una suscripción Premium no cambia ningún límite de la API. Premium desbloquea funciones en el sitio web; los planes de la API desbloquean límites de la API. Se compran por separado.
Crea un bot funcional en Python y apúntalo a esta API - código completo: feed de precios, estrategia de cruce de EMA, órdenes de apertura/cierre y el bucle principal.
El mismo bot en JavaScript - código Node.js completo, sin dependencias, apuntado a esta API.
El flujo de tres etapas que separa a los bots que funcionan de las cuentas reventadas: backtest, paper trade y luego en vivo.
Cómo funcionan los bots de grid, dónde ganan y dónde revientan, y cómo hacerles forward testing antes de financiarlos.
Qué demuestra cada etapa de prueba, y el orden exacto para usarlas.
Las estrategias asistidas por IA que realmente funcionan - y cómo probarlas sin riesgo antes de automatizarlas.