🚀 Introducción
La API de B.E.N.D.E.R. te permite acceder a las señales de trading REALES generadas por el Bot Master especializado en NASDAQ 100.
✅ Servidor en Producción: La API está operativa y sirviendo señales reales del Bot Master.
🆕 v2.0: Ahora incluye todos los campos para trailing stops, órdenes límite y gestión avanzada.
🌐 Base URL
📡 Producción:
https://api.benderbot.es:5001/api/v1
🔐 Autenticación HMAC
Todas las peticiones requieren autenticación HMAC-SHA256.
Headers Requeridos
| Header | Descripción |
|---|---|
X-API-Key | Tu API Key |
X-Timestamp | Timestamp Unix (segundos) |
X-Signature | Firma HMAC-SHA256 |
X-Session-ID | UUID único de sesión |
Generar Firma
message = timestamp + api_key signature = HMAC-SHA256(api_secret, message)
📡 Endpoints
GET
/health
Health check público - No requiere autenticación.
GET
/signals
Señales de trading REALES activas del Bot Master.
GET
/signals/history
Historial de señales (limitado según plan).
GET
/stats
Estadísticas del Bot Master.
GET
/account
Información de tu cuenta y uso actual.
GET
/sessions/active
Ver tus sesiones activas.
POST
/sessions/terminate
Terminar una sesión específica.
📋 Estructura de Señal
Cada señal del endpoint /signals contiene los siguientes campos:
Campos de Identificación
| Campo | Tipo | Descripción |
|---|---|---|
signal_id | integer | ID único de la señal |
symbol | string | Símbolo del activo (ej: "TSLA", "AAPL") |
Campos de Acción
| Campo | Tipo | Descripción |
|---|---|---|
action | string | Tipo de acción (ver tipos) |
action_type | string | Alias de action (compatibilidad) |
quantity | integer | Cantidad de acciones/contratos |
Campos de Precios
| Campo | Tipo | Descripción |
|---|---|---|
entry_price | float | null | Precio de entrada sugerido |
price | float | null | Alias de entry_price (para limit orders) |
stop_loss | float | null | Precio de stop loss |
take_profit | float | null | Precio de take profit |
stop_price | float | null | Precio para stop orders |
target_exit_price | float | null | Precio objetivo de salida |
Campos de Trailing Stop NUEVO
| Campo | Tipo | Descripción |
|---|---|---|
trail_amount | float | null | Cantidad en $ para trailing stop |
trailing_stop_pct | float | null | Porcentaje para trailing stop |
Campos de Control NUEVO
| Campo | Tipo | Descripción |
|---|---|---|
order_id | string | null | ID de orden (para cancelaciones) |
tif | string | Time in Force: "DAY", "GTC", etc. |
close_positions | boolean | Si true, cerrar todas las posiciones |
Campos de Confianza
| Campo | Tipo | Descripción |
|---|---|---|
confidence | float | Nivel de confianza (0.0 - 1.0) |
kelly_fraction | float | Fracción Kelly para sizing |
Campos de Estado y Tiempo
| Campo | Tipo | Descripción |
|---|---|---|
status | string | "active" o "inactive" |
is_active | boolean | Si la señal está activa |
created_at | string (ISO) | Fecha de creación |
expires_at | string (ISO) | Fecha de expiración |
time_to_live_minutes | integer | TTL en minutos |
Ejemplo de Respuesta
{
"success": true,
"count": 2,
"signals": [
{
// Identificación
"signal_id": 12345,
"symbol": "TSLA",
// Acción
"action": "BUY",
"action_type": "BUY",
"quantity": 10,
// Precios
"entry_price": 245.50,
"price": 245.50,
"stop_loss": 240.00,
"take_profit": 260.00,
"stop_price": null,
"target_exit_price": 258.00,
// Trailing Stop
"trail_amount": 2.50,
"trailing_stop_pct": null,
// Control
"order_id": null,
"tif": "DAY",
"close_positions": false,
// Confianza
"confidence": 0.75,
"kelly_fraction": 0.75,
// Estado
"status": "active",
"is_active": true,
"created_at": "2025-12-20T15:30:00Z",
"expires_at": "2025-12-20T15:35:00Z",
"time_to_live_minutes": 5
}
],
"timestamp": "2025-12-20T15:30:05Z"
}
🎯 Tipos de Acción
El campo action puede tener los siguientes valores:
Acciones de Trading
| Acción | Descripción | TTL |
|---|---|---|
BUY | Comprar (abrir LONG) | 5 min |
SELL | Vender (cerrar LONG o abrir SHORT) | 5 min |
SHORT | Venta en corto | 5 min |
COVER | Cubrir posición corta | 5 min |
Acciones de Gestión
| Acción | Descripción | TTL |
|---|---|---|
UPDATE_TRAILING_STOP | Actualizar trailing stop | 8 horas |
UPDATE_STOP | Modificar stop loss | 8 horas |
CANCEL_STOP | Cancelar orden de stop | 8 horas |
CANCEL_ORDER | Cancelar orden pendiente | 8 horas |
Acciones de Órdenes Límite
| Acción | Descripción | TTL |
|---|---|---|
PLACE_LIMIT | Colocar orden límite | 1 hora |
LIMIT_BUY | Orden límite de compra | 1 hora |
LIMIT_SELL | Orden límite de venta | 1 hora |
⏱️ Rate Limits
| Plan | Req/Min | Conexiones | Historial |
|---|---|---|---|
| Sandbox | 30 | 1 | 15 días |
| Basic €99 | 60 | 1 | 7 días |
| Pro €199 | 120 | 3 | 30 días |
| Enterprise €499 | 300 | 10 | Completo |
💰 Planes
🎁 Prueba gratis: 15 días sin tarjeta de crédito (plan Sandbox).
❌ Códigos de Error
| Código | Descripción |
|---|---|
| 401 | API Key inválida o firma incorrecta |
| 403 | Suscripción inactiva o trial expirado |
| 429 | Rate limit o conexiones excedidas |
| 500 | Error interno del servidor |
💻 Ejemplos de Código
Python - Obtener Señales
import hmac, hashlib, time, uuid, requests API_KEY = "bdr_live_tu_api_key" API_SECRET = "tu_api_secret" BASE_URL = "https://api.benderbot.es:5001/api/v1" SESSION_ID = str(uuid.uuid4()) def get_headers(): timestamp = str(int(time.time())) message = f"{timestamp}{API_KEY}" signature = hmac.new(API_SECRET.encode(), message.encode(), hashlib.sha256).hexdigest() return { "X-API-Key": API_KEY, "X-Timestamp": timestamp, "X-Signature": signature, "X-Session-ID": SESSION_ID } # Obtener señales response = requests.get(f"{BASE_URL}/signals", headers=get_headers()) data = response.json() for s in data.get("signals", []): print(f"{s['action']} {s['quantity']} {s['symbol']}") # Verificar trailing stop if s.get('trail_amount'): print(f" Trailing: ${s['trail_amount']}") # Verificar stop loss if s.get('stop_loss'): print(f" Stop Loss: ${s['stop_loss']}")
Python - Procesar Trailing Stop
def process_signal(signal): action = signal.get('action') symbol = signal.get('symbol') if action == 'BUY': # Ejecutar compra execute_buy( symbol=symbol, quantity=signal.get('quantity'), stop_loss=signal.get('stop_loss'), take_profit=signal.get('take_profit') ) elif action == 'UPDATE_TRAILING_STOP': # Actualizar trailing stop update_trailing( symbol=symbol, trail_amount=signal.get('trail_amount'), tif=signal.get('tif', 'DAY') ) elif action == 'SELL': # Cerrar posición close_position(symbol)