Skip to content

Errors

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

How errors surface

  1. Thrown errorsgetSupportedCurrencies, createOrder, getOrder, closeOrder reject with ConnectSdkError (stable code).
  2. EventsexchangePay: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 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 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
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.