PollarPollar
Sdk Reference

Error Codes

Pollar surfaces errors in two places: the Server / SDK API (HTTP responses) and the client SDK (method outcomes and reactive state). This page documents both, plus the real error codes.


Error model

Server / SDK API responses

Every API response uses a fixed envelope. Errors are flat — there is no error wrapper and no message/status field in the body (the HTTP status code carries the status):

{
  "code": "INSUFFICIENT_FUNDS_FOR_TRUSTLINE",
  "success": false
}

Some errors include extra fields (e.g. validation issues):

{
  "code": "VALIDATION_ERROR",
  "success": false,
  "details": { "fieldErrors": { "publicKey": ["Must start with G"] } }
}

Successful responses are { "content": <data>, "code": "<SUCCESS_CODE>", "success": true }.

Client SDK

Most @pollar/core methods do not throw on operational failures. Instead they:

  • Return an outcome object — e.g. buildTx, signAndSubmitTx, runTx resolve to { status: 'error', details?, resultCode? } (vs 'built' | 'success' | 'pending').
  • Drive reactive statetx.step === 'error' carries { phase, details }; auth/balance/history states expose { step: 'error', message }.
const result = await pollar.runTx('payment', { destination, amount, asset });
if (result.status === 'error') {
  console.error(result.details, result.resultCode);
}

The only error that is thrown is PollarFlowError (exported from @pollar/core), raised when a flow method is called out of order (e.g. verifying an OTP code before one was sent). Its code is always 'INVALID_FLOW':

import { PollarFlowError } from '@pollar/core';

try {
  pollar.verifyEmailCode('123456');
} catch (err) {
  if (err instanceof PollarFlowError) {
    // called the wrong step for the current AuthState
  }
}

Auth flow error codes (surfaced on the error AuthState) are exported as AUTH_ERROR_CODES (e.g. SESSION_EXPIRED, EMAIL_CODE_INVALID, WALLET_AUTH_FAILED, PASSKEY_FAILED).


Auth, API keys & access

CodeDescriptionResolution
INVALID_CREDENTIALSMissing or invalid credentialsCheck the credentials you are sending
FORBIDDENAuthenticated but not allowed to perform this actionVerify the key type / permissions
API_KEY_NOT_FOUNDAPI key does not exist or was revokedGenerate a new key from Build → API Keys
API_KEY_EXPIREDAPI key has expiredRotate the key
API_KEY_TYPE_NOT_ALLOWEDPublishable key used on a secret-key route (or vice versa)Use a secret key on the Server API, publishable on the SDK API
ORIGIN_NOT_ALLOWEDRequest origin is not in the app's allowed originsAdd the origin under Build → Domains
RATE_LIMITEDToo many requestsBack off and retry

Keys are network-specific by prefix: pub_testnet_ / pub_mainnet_ (publishable) and sec_testnet_ / sec_mainnet_ (secret).


Validation & general

CodeDescriptionResolution
VALIDATION_ERRORMalformed body or failed schema validationCheck the payload against the API reference
INVALID_JSONRequest body is not valid JSONSend a valid JSON body
USER_NOT_FOUNDUser does not exist in your appVerify the externalId / user
APPLICATION_NOT_FOUNDApplication not found for the keyVerify the API key
INTERNAL_SERVER_ERRORUnexpected server errorRetry; contact support if it persists
NOT_IMPLEMENTEDEndpoint exists but is not yet wired upFeature is on the roadmap

Wallet & funding

CodeDescriptionResolution
WALLET_NOT_FOUNDPublic key is not a wallet owned by your appVerify the publicKey
WALLET_NOT_FUNDEDWallet exists but is not yet fundedActivate the wallet before transacting / adding trustlines
WALLET_ALREADY_FUNDEDWallet is already activeSafe to ignore — idempotent activation
WALLET_CREATION_FAILEDFailed to create the wallet on StellarRetry — transient Stellar network issue
FUND_XLM_FAILEDFunding the XLM reserve failedCheck the funding wallet balance, then retry
FRIENDBOT_NOT_AVAILABLETestnet Friendbot funding is unavailableRetry shortly
WALLET_ADAPTER_NOT_SUPPORTEDServer-side wallet provisioning not supported for BYO custody appsProvision wallets via your adapter

Trustlines

CodeDescriptionResolution
TRUSTLINE_FAILEDFailed to create/remove a trustline on StellarRetry — transient network issue
INSUFFICIENT_FUNDS_FOR_TRUSTLINENot enough XLM to cover the trustline reserve (0.5 XLM)Top up the funding wallet
TRUSTLINE_HAS_BALANCECannot remove a trustline that still holds a balanceMove the balance to zero first
NO_DEFAULT_TRUSTLINESNo default assets are configured for the appConfigure assets under Treasury → Tokens & Trustlines

Transactions

CodeDescriptionResolution
SDK_TX_BUILD_ERRORThe transaction could not be builtCheck operation params (destination, amount, asset)
TX_UNSUPPORTED_OPERATIONOperation type is not supportedUse a supported operation (e.g. payment)
TX_INVALID_SIGNED_XDRThe signed XDR is malformedRe-sign from the built XDR
TX_SIGN_FAILEDSigning failedRetry; for external wallets, re-approve in the wallet
TX_SUBMIT_FAILEDStellar rejected the transactionInspect resultCode on the outcome
TX_IDEMPOTENCY_CONFLICTA conflicting submission is already in flightWait and check transaction status

Distribution

CodeDescriptionResolution
DISTRIBUTION_RULE_NOT_FOUNDThe distribution rule does not existVerify the rule id
DISTRIBUTION_ASSET_NOT_ENABLEDThe asset is not enabled for distributionEnable it under Treasury → Token Distribution
DISTRIBUTION_RULE_DISABLEDThe rule is disabledEnable the rule
DISTRIBUTION_RULE_EXPIREDThe rule's validity window has ended
DISTRIBUTION_RULE_EXHAUSTEDThe rule's total allocation is used up
DISTRIBUTION_RATE_LIMIT_EXCEEDEDThe user exceeded the rule's claim rate limitConfigured per rule in Treasury → Token Distribution
DISTRIBUTION_NO_DISTRIBUTION_WALLETNo distribution wallet is configuredConfigure one under Treasury → Token Distribution

KYC & Ramps

CodeDescription
SDK_KYC_PROVIDER_NOT_FOUNDKYC provider not found
SDK_KYC_PROVIDER_NOT_ENABLEDKYC provider not enabled for the app
SDK_KYC_SESSION_EXPIREDKYC session expired
SDK_KYC_VERIFICATION_NOT_FOUNDKYC verification not found
SDK_RAMPS_PROVIDER_NOT_FOUNDRamp provider not found
SDK_RAMPS_QUOTE_NOT_FOUNDRamp quote not found
SDK_RAMPS_QUOTE_EXPIREDRamp quote expired — request a new one
SDK_RAMPS_TX_NOT_FOUNDRamp transaction not found

Session, DPoP & passkeys

End-user session and token errors (sdk-api). These are handled by the SDK's auth flow; surface to users as "please sign in again".

CodeDescription
SDK_AUTH_INVALID_TOKEN / SDK_AUTH_TOKEN_EXPIREDAccess token invalid or expired
SDK_AUTH_DPOP_REQUIRED / SDK_AUTH_DPOP_INVALID / SDK_AUTH_DPOP_USE_NONCEDPoP proof required / invalid / needs nonce
SDK_REFRESH_TOKEN_INVALID / _EXPIRED / _REUSEDRefresh token invalid, expired, or reused
PASSKEY_CHALLENGE_MISSING / PASSKEY_VERIFICATION_FAILED / PASSKEY_DEPLOY_FAILEDPasskey ceremony errors

This is not the full enum — the server defines additional internal codes (hub-api admin, Pollar Pay, authentik, wallet-adapter). The codes above are the ones an SDK or Server API integrator is most likely to encounter.


Handling errors in the SDK

import { PollarFlowError } from '@pollar/core';

// Operational failures come back as outcomes — no try/catch needed.
const result = await pollar.runTx('payment', { destination, amount, asset });
if (result.status === 'error') {
  switch (result.resultCode) {
    case 'tx_insufficient_balance':
      // not enough of the asset
      break;
    default:
      console.error(result.details);
  }
}

// Misuse of the flow API throws.
try {
  pollar.sendEmailCode('user@example.com');
} catch (err) {
  if (err instanceof PollarFlowError) {
    // wrong step for the current AuthState
  }
}

To observe transaction failures reactively, subscribe to onTransactionStateChange and inspect state.phase / state.details when state.step === 'error'.

On this page

Was this helpful?