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, sin depósito. Tú decides cada condición de ejecución: tamaño del libro, slippage, latencia, ejecuciones parciales, rechazos, comisiones. Gratis para siempre con 120 peticiones por minuto - Pro cuesta $27 cuando un bot se convierte en cuatro. Los datos de mercado siguen sin necesitar 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 } }
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.
Toda cuenta empieza en Free y obtiene el producto completo: el motor de trading, comisiones reales de cada exchange, entradas límite y stop, trailing stops, replay, books, el stream de WebSocket y todos los datos de mercado sin necesidad de clave. Los planes de pago elevan los límites y añaden webhooks, desgloses del informe con hallazgos escritos, 90 días de historial de operaciones en lugar de 30, y más claves y books. El motor en sí nunca se retiene.
El motor completo, gratis durante 7 días desde el día que generas tu primera clave. Después, el motor necesita un plan - los datos de mercado siguen siendo gratis y sin clave para siempre, sin ninguna cuenta.
Para un bot que corre sin supervisión, y para comparar estrategias en vez de adivinar entre ellas.
Para 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.
En 125 cuentas y 174 claves, el bot más activo en producción llega a un máximo de 66 peticiones por minuto de las 120 que ya permite el plan Free, y ninguna clave ha sido limitada por exceso de peticiones en ningún plan. El único límite de Free que sí se alcanza es el de claves: 12 de esas 125 cuentas están en el límite de tres claves o lo superan, porque una configuración seria quiere una clave por bot para que un backtest y una estrategia en vivo nunca compartan el mismo presupuesto de peticiones. Los webhooks y los libros adicionales están en los planes de pago y hasta ahora no han tenido ninguna adopción - preferimos decir eso antes que venderte un plan para algo que nadie usa. Todo lo que decide si un resultado es real - el motor, cada mercado, las órdenes límite y stop, el replay, el stream de WebSocket, toda la simulación configurable y el desglose de costos en tu informe - está en Free.
| Lo que cambia con el plan | Free | Pro · $27 | Max · $69 | Business · $139 |
|---|---|---|---|---|
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 |
| 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.
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 76.4% de cada llamada a esta API en los últimos 40 días fue un poll a /positions o /account - 890,921 y 471,390 llamadas - mientras que el WebSocket se abrió 15 veces en toda su vida. El stream es gratis en todos los planes a propósito - restringirlo empujaría a todos de nuevo al polling, que nos cuesta más que el stream. Si tienes que hacer polling, devuelve el ETag: un poll sin cambios entonces cuesta solo 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.
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.
Dieciocho campos y ocho preajustes: el tamaño del libro y si es un presupuesto real, lo que cuesta cruzar el libro de órdenes al entrar y al salir, cuánto tiempo está tu orden en tránsito, ejecuciones parciales, con qué frecuencia el exchange rechaza, tu propia comisión, el funding, y dónde se ubica la liquidación. Freqtrade te deja configurar el saldo inicial y nada más; un testnet te da lo que su libro te dé. Cada campo, con su rango →
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.
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.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.
Estos tres son un subconjunto. Toda la simulación es configurable - el tamaño del libro y si es un presupuesto real, tus propias cifras de slippage y comisión, el impacto por tamaño, la latencia, las ejecuciones parciales, los rechazos y el funding - y ocho preajustes lo configuran en una sola llamada. 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é condiciones se ejecutó. De ahí viene la columna Fills de la arena - una tabla que clasifica bots debería decir cuáles estaban en modo fácil.
Los tres interruptores de arriba son parte de algo más grande. Todo lo que este motor asume es un campo que puedes configurar: el tamaño del libro y si es un presupuesto real, lo que cuesta cruzar el libro de órdenes al entrar y al salir, cuánto tiempo está tu orden en tránsito, si una orden se ejecuta parcialmente, con qué frecuencia el exchange dice que no, cuánto pagas en comisiones, si se cobra funding o no, y dónde se ubica el precio de liquidación.
Los valores predeterminados son deliberadamente fáciles, y vale la pena decirlo sin rodeos. Una orden a mercado se ejecuta completa al precio en vivo, el margen de mantenimiento es un 0.5% fijo, el saldo es un marcador que nunca rechaza una apertura, y no hay latencia ni impacto por tamaño. Ese es el lugar correcto para poner un bot a andar. Es el lugar equivocado para juzgar si tiene una ventaja. Una sola llamada cambia eso.
GET /api/bot/v2/sim # your profile, every field with its range, and the presets
POST /api/bot/v2/sim {"preset": "realistic"}
# or exactly your own venue
POST /api/bot/v2/sim {"start_balance_usd": 2500, "margin_enforced": true,
"slippage": true, "slippage_bps": 8, "impact_bps_per_100k": 15,
"latency_ms": 250, "taker_bps": 5.5, "margin_venue": "bybit"}
Los valores fuera de rango son rechazados, nunca ajustados al límite - una estrategia nunca debe medirse bajo una configuración que no elegiste. Una posición conserva el margen de mantenimiento, la tasa de comisión y el costo de cruce en la salida con los que fue ejecutada, para siempre; activar cualquier cosa nunca reescribe una operación que ya tienes abierta.
El motor como siempre ha sido. Pon el bot a andar, mira cómo caen las operaciones, y después cámbialo.
El que usar para medir una ventaja: el libro cuesta lo que medimos en ambas patas, el tamaño cuesta más, la escala de límites de riesgo está activa, se cobra el funding, y el libro rechaza lo que no puede financiar.
La comisión taker y el margen de mantenimiento publicados por ese exchange, con nuestro costo de cruce medido, margen aplicado y la escala activa.
Un perpetuo de capitalización media en un mal momento, y luego algo peor que cualquier cosa que vayas a encontrar: 60 bps para cruzar, 120 bps por cada $100k de tamaño, ejecuciones desde un cuarto hacia arriba, un rechazo de cada veinte aperturas, un segundo de latencia. Son cifras nuestras, no de ningún exchange. Si una estrategia aún funciona aquí, no está viviendo de la suerte en la ejecución.
| Campo | Rango | Qué hace |
|---|---|---|
| El libro — lo que el bot puede arriesgar | ||
start_balance_usd | 100 – 10,000,000 | El libro contra el que se miden tus resultados: return_pct, la curva de equity y el drawdown máximo siguen este valor. Pruébalo con el tamaño de cuenta con el que realmente vas a operar. |
margin_enforced | desactivado / activado | La diferencia más grande entre un marcador y un exchange real. Activado, una apertura que necesite más que tu margen libre es rechazada con 402 insufficient_margin. El margen libre es el saldo menos el margen comprometido — el beneficio no realizado de una posición abierta no es garantía para una nueva, porque aquí toda posición usa margen aislado. |
leverage_max | 0 – 10,000 | Tu propio tope por debajo del límite de cada mercado. Demuestra que una estrategia nunca se deslizó en silencio hasta 100×. 0 = el límite del mercado. |
max_notional_usd | 0 – 1,000,000,000 | Tu propio tope sobre el valor nocional de una posición. 0 = ninguno propio. |
| La ejecución — lo que cuesta cruzar el libro | ||
slippage | desactivado / activado | Ejecuta en tu contra tal como lo haría caminar por un libro real: 0.01% para las criptos principales, 0.05% para criptos más delgadas, 0.005% forex, 0.02% acciones, metales e índices. Una compra paga de más, una venta vende de menos. |
slippage_bps | 0 – 500 | Tu propia cifra en lugar de esa tabla. 10 = 0.10%. null vuelve a la tabla. |
impact_bps_per_100k | 0 – 500 | El tamaño cuesta más, porque una orden más grande recorre más profundo el libro: tantos puntos básicos adicionales por cada $100,000 de valor nocional. |
exit_slippage | activado / desactivado | Paga el costo de cruce tanto al salir como al entrar. Sin esto, una estrategia de scalping se ve mejor en el papel de lo que nunca podrá operar en la realidad. Un stop-loss, take-profit o liquidación sigue ejecutándose a su propio nivel — ver los límites abajo. |
latency_ms | 0 – 2,000 | Tu orden está en tránsito este tiempo, y el precio se vuelve a leer después — así que la ejecución refleja el mercado como estaba cuando tu orden llegó, no cuando la enviaste. |
partial_fills | desactivado / activado | Una orden a mercado puede ejecutarse por menos de lo que pidió. El tamaño ejecutado es position.margin_usd; la proporción está en el encabezado X-MP-Fill-Pct y en el objeto fill en v2. |
min_fill_pct | 10 – 100 | La peor proporción que te pueden dar. 40 significa cualquier valor entre 40% y 100% de lo que pediste. |
reject_rate_pct | 0 – 50 | Esta proporción de aperturas se rechaza a propósito con 503 venue_rejected. Un bot que no puede manejar un rechazo no está terminado, y este es el lugar barato para descubrirlo. |
| El costo | ||
taker_bps | 0 – 100 | Tu propia comisión por lado en lugar de la tabla de un exchange. 5.5 = 0.055%. El ajuste decreciente por apalancamiento sigue aplicándose, así que ninguna configuración puede hacer que un ciclo completo se coma todo el margen. |
funding | activado / desactivado | Desactivado, el funding nunca se cobra. Así distingues una ventaja de ejecución de una ventaja de carry — un short mantenido durante funding positivo puede ser rentable solo por el funding. |
funding_mult | 0 – 5 | Escala la tasa real cada 8 horas. |
| La liquidación | ||
margin_venue | 10 exchanges | Cuya tasa de margen de mantenimiento publicada decide dónde se ubica la liquidación. Binance 0.40%, Bybit 0.50%, MEXC 0.10%, Kraken 0.60%, Hyperliquid 1.25%, Coinbase 1.33%. Mueve únicamente el precio de liquidación. |
margin_tiers | desactivado / activado | El margen de mantenimiento aumenta con el valor nocional de la misma forma que una escala de límites de riesgo, así que una posición grande se liquida antes. Toda la escala está publicada en GET /v2/realism. |
mmr_pct | 0.05 – 10 | Tu propio margen de mantenimiento, por encima de margin_venue y nuestro valor predeterminado. |
Un stop-loss, take-profit o liquidación se ejecuta a su propio nivel y nunca paga el costo de cruce: el barrido del lado del servidor corre sobre todas las cuentas a la vez y no puede leer un perfil por cada pasada. No hay un libro de órdenes con profundidad real detrás del modelo de impacto — impact_bps_per_100k es un costo lineal declarado, no un libro simulado. Y todo el costo de cruce en la salida se cobra contra el mark, que es un único spread, no un bid y un ask que puedas cotizar por separado. Todo lo demás arriba se aplica exactamente como está escrito.
Cada cifra de este perfil se puede leer de vuelta desde GET /api/bot/v2/sim, incluyendo cómo se vería una ejecución justo ahora — un número que un bot no puede leer de vuelta es un número que tiene que adivinar. GET /api/bot/v2/report te dice entonces cuánto costó realmente la ejecución: comisiones, funding, bruto contra neto, y kept_pct, la parte del bruto que sobrevivió. Ese dato es gratis en todos los planes, porque no es un desglose de dónde está tu ventaja — es si esa ventaja es real.
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 durante los últimos 40 días: el 76.4% de cada llamada a esta API es un sondeo de /positions y /account buscando eventos que todavía no sucedieron. Un webhook invierte eso - te hacemos un POST cuando algo realmente sucede, con la misma forma de Position que habría devuelto un sondeo, y funciona incluso 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 veintiocho 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 necesitan un plan de pago. Todo lo demás en esta página está en Free. El cuerpo incluye 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. |
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. |
¿Sigues atascado? El cuerpo del error es el primer lugar donde mirar, y estado es el segundo. Si ninguno lo resuelve, escribe a support@marginpad.io con el endpoint y el cuerpo exacto que te devolvimos - qué más incluir está en la página de soporte. Una persona lo lee.
Liquidaciones en tiempo real agregadas de ocho exchanges por nuestro propio colector - 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.
Abre una cuenta en Bybit →Sí - MarginPad expone liquidaciones en tiempo real agregadas de 8 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.