> ## Documentation Index
> Fetch the complete documentation index at: https://v2.docs.conduit.financial/llms.txt
> Use this file to discover all available pages before exploring further.

# USER_SIGNATURE_TIMEOUT error

> A non-custodial payout timed out waiting in the wallet's signing queue before it could start collecting signatures

## What happened

A wallet signs one payout at a time. This payout waited behind other in-flight payouts on the same wallet and **timed out in the signing queue before it could start collecting signatures**. No funds were moved. The payout is in a terminal failed state with `failureCode: user_signature_timeout`.

This is a **queue-wait** failure, not a signing-window failure. The payout never reached the signing step, so no `transaction.awaiting_signature` webhook was sent for it. If instead your signer *was* asked to approve (you received `transaction.awaiting_signature`) but the signing window closed before the roster signed, the code is [`user_signature_expired`](/errors#user-signature-expired), not this one.

```json theme={null}
{
  "type": "USER_SIGNATURE_TIMEOUT",
  "title": "User signature timeout",
  "status": 422,
  "detail": "The payout waited too long in the wallet's signing queue and timed out before it could start collecting signatures.",
  "resolution": "Submit a new payout once the wallet's earlier payouts have finished signing.",
  "docs": "/errors#user-signature-timeout",
  "instance": "/v2/payouts/txn_abc123",
  "correlationId": "corr_xyz789",
  "timestamp": "2026-01-15T09:30:00.000Z"
}
```

## Common causes

* **Too many payouts on one wallet at once** -- a wallet signs one payout at a time, so payouts submitted together queue behind each other on the same wallet.
* **An earlier payout held the wallet for its full signing window** -- while one payout waits for its signers, the payouts queued behind it can age out of the queue before they ever reach the signing step.

## Recovery

<Warning>
  This is a terminal state. The payout cannot be recovered; a new payout must be
  submitted.
</Warning>

**1. Confirm the terminal state**

```bash theme={null}
curl -X GET https://api.conduit.financial/v2/payouts/txn_abc123 \
  -H "x-api-key: YOUR_API_KEY"
```

**2. Submit a new payout once the wallet is free**

Once the wallet's earlier payouts have finished signing, submit a new payout with a fresh idempotency key:

```bash theme={null}
curl -X POST https://api.conduit.financial/v2/payouts \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Idempotency-Key: idem_NEW_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "customerId": "cus_abc123",
    "assetAmount": {"code": "USDC", "amount": "50.000000", "chain": "ethereum"},
    "destination": {
      "recipient": {
        "rail": "crypto",
        "chain": "ethereum",
        "address": "0xabc..."
      }
    }
  }'
```

## Prevention

* **Limit concurrent payouts per wallet** -- submit the next payout on a wallet after the previous one has cleared the signing step, rather than many at once, so payouts do not stack up in the queue.
* **Handle `transaction.failed` with this code** -- branch on `failureCode === 'user_signature_timeout'` to resubmit once the wallet's earlier payouts have finished signing.

## Related webhooks

The `transaction.failed` event fires when the payout times out in the queue:

```json theme={null}
{
  "type": "transaction.failed",
  "data": {
    "transactionId": "txn_abc123",
    "failureCode": "user_signature_timeout"
  }
}
```

## Related endpoints

* [GET /v2/payouts/:id](/api-reference/payouts/retrieve-a-payout) -- read payout state
* [POST /v2/payouts](/api-reference/payouts/create-a-payout) -- submit a new payout
* [POST /v2/sandbox/payouts/:id/simulate/cosign](/sandbox/cheat-sheet) -- simulate cosign in sandbox
