Skip to content

Errors ​

How Exchange Pay failures surface and what to do at each step.

How errors surface ​

  1. Thrown errors - getSupportedCurrencies, createOrder, getOrder, closeOrder reject with ConnectSdkError (stable code).
  2. Events - exchangePay:orderExpired is not an error, but you must handle it in UI; completion comes via exchangePay:orderCompleted.

Branch on code, not on message text:

ts
import { ConnectSdkError, ConnectSdkErrorCode } from '@swapped/connect-sdk'

try {
  await client.exchangePay.createOrder({
    /* provider, amount, token, blockchain */
  })
} catch (error) {
  if (!(error instanceof ConnectSdkError)) {
    throw error
  }

  switch (error.code) {
    case ConnectSdkErrorCode.SESSION_NOT_ACTIVE:
      await client.restartSession()
      break
    case ConnectSdkErrorCode.NO_ACTIVE_ORDER:
      // User landed on checkout without createOrder - go back to form
      break
    case ConnectSdkErrorCode.CLOSE_ACTIVE_ORDER_FAILED:
      // Retry close, or createOrder again (create clears previous when possible)
      break
    default:
      // API_ERROR / unknown - generic retry
      break
  }
}

client.exchangePay.onOrderExpired(() => {
  // Not a thrown error - show expired UI
})

When things fail in the flow ​

StepWhat goes wrongHow you see itWhat to do in UI
Load currenciesAPI / network failureAPI_ERRORRetry; keep provider selected
Create orderSession already completedSESSION_NOT_ACTIVErestartSession() first
Create orderSession not loadedSESSION_REQUIREDloadSession()
Create orderSession replaced mid-flightSESSION_REPLACEDIgnore; start again on the new session
Create orderAPI rejection (amount, etc.)API_ERRORShow message; fix amount / retry
Checkout leaveClose API failed (canClose)CLOSE_ACTIVE_ORDER_FAILEDRetry close or create a new order
Status / closeNo order in memoryNO_ACTIVE_ORDERBack to amount form / createOrder
WaitingOrder timed outexchangePay:orderExpiredExpired UI; create a new order
After successCreate again without restartSESSION_NOT_ACTIVErestartSession()

Amount below minAmountFiat or above maxAmountFiat should be blocked in the form before createOrder. Provider-side amount errors still surface as API_ERROR.

Error code reference ​

CodeWhen it happensWhat to do
SESSION_REQUIREDNo loaded sessionCall loadSession()
SESSION_NOT_ACTIVESession cannot accept a new paymentrestartSession() before createOrder
SESSION_REPLACEDSession was replaced while create/close was in flightIgnore; start again on the new session
NO_ACTIVE_ORDERgetOrder / closeOrder without an active orderCall createOrder first
CLOSE_ACTIVE_ORDER_FAILEDProvider close request failedRetry close, or create a new order
API_ERRORCurrencies / create / status / close HTTP failureRetry; keep user on a safe step
CLIENT_DESTROYEDClient already destroyedCreate a new client

canClose === false providers (Bybit, OKX): do not treat “no cancel button” as an error - skip close UI and create a new order when needed.