Skip to main content

What happened

You submitted a payout from a non-custodial wallet, but that wallet already has another payout sitting at the user-signature step on the same chain. This returns HTTP 409 with error code CONCURRENT_COSIGN_IN_FLIGHT.
{
  "type": "CONCURRENT_COSIGN_IN_FLIGHT",
  "title": "Concurrent Cosign In Flight",
  "status": 409,
  "detail": "Wallet wlt_abc123 already has a non-custodial payout awaiting signature on ETHEREUM.",
  "resolution": "Wait for the prior payout from this wallet to reach a terminal state before creating a new one.",
  "docs": "/errors#concurrent-cosign-in-flight",
  "instance": "/v2/payouts",
  "correlationId": "corr_xyz789",
  "timestamp": "2026-01-15T09:30:00.000Z"
}

Common causes

  • Rapid payout submission — your integration submitted a second payout before the first one finished the signing step
  • Abandoned signing session — the user closed the signing page without approving or declining, leaving the payout at the cosign gate
  • Parallel payout requests — two concurrent requests from your backend both resolved a wallet and submitted payouts simultaneously

Recovery

1. Identify the in-flight payout List the customer’s transactions filtered by withdrawal type to find the one waiting for a signature:
curl -X GET 'https://api.conduit.financial/v2/transactions?type=withdrawal&status=pending' \
  -H "x-api-key: YOUR_API_KEY"
2. In sandbox: resolve the in-flight payout Drive the pending payout to a terminal state using the cosign simulate endpoint:
curl -X POST https://api.sandbox.conduit.financial/v2/sandbox/payouts/txn_prior123/simulate/cosign \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"outcome": "approved"}'
Use "declined" to cancel it instead. 3. In production: wait for the signing window to close The user must approve or decline the payout from their signing session. The gate closes automatically when the signing window expires. Once the prior payout reaches a terminal state (completed or failed), the 409 clears and you can resubmit. 4. Resubmit the new payout
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

  • Serialize payouts per wallet — queue outgoing payouts and only submit the next one after the prior one terminates
  • Track signing state — maintain a flag per wallet indicating whether a signing session is open; block new submissions until it clears
  • Listen for transaction.failed and transaction.completed — use these events to gate the next payout rather than polling