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:

StatusMeaningTerminal?
RECEIVEDrecorded, execution pendingno
EXECUTEDexecuted; result holds the success payloadyes
REJECTEDdeterministically invalid; result holds the reasonyes
FAILEDinfrastructure error; will be retried / can be re-drivenno
👍

The retry rule

Re-sending with the same idempotency-key is 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.


Did this page help you?