webhooks
Schema del payload
El schema JSON que Spectra acepta en órdenes vía webhook.
Spectra acepta un único shape JSON en POSTs de webhook. Cualquier otra cosa devuelve 400 Bad Request con un body de error de schema.
Order mínima
{
"action": "buy",
"symbol": "BTCUSDT",
"qty": 1
}
Rutea un market buy. La conexión de bróker se decide por el secret con que se firmó la request.
Schema completo
{
"action": "buy" | "sell" | "close" | "flatten",
"symbol": "string",
"qty": number,
"type": "market" | "limit" | "stop" | "stop_limit"
| "trailing_stop", // default: market
"limit_price": number, // requerido para limit / stop_limit
"stop_price": number, // requerido para stop / stop_limit
"trail_offset": number, // requerido para trailing_stop
"tp": number | { "value": number, "kind": "abs" | "pct" | "atr" },
"sl": number | { "value": number, "kind": "abs" | "pct" | "atr" },
"tif": "day" | "gtc" | "ioc" | "fok", // default: day
"client_id": "string" // tu idempotency key (≤ 64 chars)
}
flatten ignora qty y cierra todo del símbolo.
close cierra una cantidad específica (default = posición completa).
Idempotency
Si client_id está set, Spectra deduplica. Re-POSTear el mismo
client_id en 24 h devuelve 200 OK con el resultado original en
vez de colocar una orden duplicada. Recomendado para cualquier
fuente de alertas que pueda reintentar por su cuenta (la mayoría lo
hace — usa un client_id único por cada orden intencional).
Respuesta
202 Accepted → body: { "order_id": "...", "client_id": "..." }
400 Bad Request → schema o regla de negocio falla (cap pérdida, ...)
401 Unauthorized → firma/timestamp inválidos
403 Forbidden → IP no en allowlist, o secret pausado
429 Too Many Requests → rate-limit (1 req/seg/secret default)