Signal Lifecycle & Recovery
Signal statuses, safe idempotent retries, the status endpoint, and order cancellation.
Every accepted request creates a durable signal keyed by your idempotency-key. Its status is one of:
| Status | Meaning | Terminal? |
|---|---|---|
RECEIVED | recorded, execution pending | no |
EXECUTED | executed; result holds the success payload | yes |
REJECTED | deterministically invalid; result holds the reason | yes |
FAILED | infrastructure error; will be retried / can be re-driven | no |
The retry ruleRe-sending with the same
idempotency-keyis always safe. A terminal signal returns its stored result without re-executing (replayed: true); a non-terminal one is re-driven toward execution. Pending signals are also swept and executed server-side within ~2 minutes even if you never retry.
Signal status endpoint
Signed, no body:
GET /bot/v1/spot/signals/<signalId>
{
"signalId": "0198f9…",
"status": "EXECUTED",
"result": { "status": true, "message": "Trade executed successfully", "data": { "…": "…" } },
"receivedAt": "2026-07-20T10:15:00.000Z",
"processedAt": "2026-07-20T10:15:01.250Z"
}Returns 404 for signals that don't exist or don't belong to your API key's account.
This is your recovery path when a submit response was lost in transit (network drop, timeout on your side): the signalId came back in the 202 body, or you can simply re-send the original request with the same idempotency-key and receive the stored result.
List your orders
Signed, no body — the authenticated API key identifies the strategy, so the route carries no parameter:
GET /bot/v1/spot/orders
Returns your key's order signals, newest first (up to 500), each with its signalId, status, your original order body echoed back, timestamps — and the collectiveId of executed placements, which is the handle cancellation uses:
{
"status": true,
"message": "Orders retrieved",
"data": [
{
"signalId": "0198f9…",
"status": "EXECUTED",
"collectiveId": "917fa72c-…",
"order": { "symbol": "BTCUSDT", "tradeType": "LIMIT", "…": "…" },
"receivedAt": "2026-07-20T10:15:00.000Z",
"processedAt": "2026-07-20T10:15:01.250Z"
}
]
}collectiveId is null for signals that have not executed.
Cancel an order group
Signed, JSON body, no idempotency-key — cancellation is naturally idempotent (repeating it no-ops):
POST /bot/v1/spot/orders/cancel
{ "collectiveId": "917fa72c-…" }
collectiveId must be a UUID, taken from the order-list endpoint above (or from the placement's execution result). Cancelling something already filled or already cancelled returns the corresponding message rather than an error loop.
Close a strategy
Signed, empty JSON body ({}), no idempotency-key — closing an already-closed strategy simply replays "already closed", and a partially-failed close is safe to retry. The strategy closed is the one bound to your API key:
POST /bot/v1/spot/strategy/close
{}
This ends the bot-managed strategy and unwinds copier participation. It is permanent — a closed strategy cannot be reopened; create a new one in the Wellat app if you want to trade again.
Next: Rate Limits & Errors.
Updated 12 days ago