跳轉到主要內容

錯誤響應格式

所有 API 錯誤都遵循統一的響應格式:
{
  "code": 40001,
  "timestamp": "2026-02-05T10:30:00.000Z",
  "message": "Human readable error message",
  "details": {
    // 可选的额外信息
  }
}

HTTP 狀態碼

狀態碼說明錯誤碼範圍
400錯誤請求400, 40001-40040
401未授權401
403禁止訪問403, 40301
404未找到404, 40401-40406
429請求過多429, 42901-42902
500伺服器錯誤500, 50001-50036
510紅包錯誤51000-51004
520Webhook 錯誤52000-52001

客戶端錯誤 (400)

引數驗證錯誤

錯誤碼名稱說明解決方案
400BAD_REQUEST錯誤請求檢查請求格式
40001VALIDATION_ERROR請求引數異常或不正確檢查引數格式和取值
40002INVALID_PARAMETER引數無效檢查引數值是否符合要求
40003INVALID_TOKEN訪問令牌無效檢查 Token 格式
40004MISSING_PARAMETER缺少必填引數新增缺失的必填引數
40005INVALID_ADDRESS錢包地址格式無效檢查地址格式是否正確
40027INVALID_CURSOR遊標無效使用有效的分頁遊標
40031INVALID_TIMESTAMP時間戳格式無效使用 ISO 8601 格式
40032INVALID_RESOLUTION解析度引數無效使用支援的 K 線週期
40033INVALID_NUMBER_FORMAT數字格式無效使用正確的數字格式
{
  "code": 40002,
  "timestamp": "2026-02-05T10:30:00.000Z",
  "message": "Invalid parameter",
  "details": {
    "parameter": "resolution",
    "value": "2h",
    "allowed_values": ["1s", "1m", "5m", "15m", "1h", "4h", "1d"]
  }
}

代幣相關錯誤

錯誤碼名稱說明解決方案
40009INVALID_TOKEN_ADDRESS代幣地址無效檢查代幣合約地址
40028TOKEN_ADDRESSES_LIMIT_EXCEEDED代幣地址數量超限最多 100 個地址
40034TOKEN_ALREADY_CREATED代幣已建立檢查是否重複建立

錢包相關錯誤

錯誤碼名稱說明解決方案
40029WALLET_ADDRESSES_LIMIT_EXCEEDED錢包地址數量超限最多 100 個地址

交易相關錯誤

錯誤碼名稱說明解決方案
40010TRANSACTION_FAILED交易執行失敗檢查交易引數和餘額
40011TRANSACTION_REJECTED交易被拒絕檢查簽名和許可權
40012INVALID_TRANSACTION交易無效檢查交易結構
40025TRANSACTION_NOT_SIGNED交易未簽名序列化前需要簽名
40026TRANSACTION_SIGNATURE_MISSING交易簽名缺失新增交易簽名
40039TRANSACTION_SIZE_EXCEEDED交易大小超限減少交易複雜度

DEX 交易錯誤

錯誤碼名稱說明解決方案
40006LIQUIDITY_INSUFFICIENT流動性不足減少交易金額
40007PRICE_IMPACT_TOO_HIGH價格影響過大減少金額或提高滑點
40008SLIPPAGE_TOO_HIGH滑點過高調整滑點設定
40014INVALID_AMOUNT金額無效使用有效的數字
40015AMOUNT_TOO_SMALL金額過小增加交易金額
40016AMOUNT_TOO_LARGE金額過大金額超出安全範圍
40017SAME_TOKEN_SWAP相同代幣交換輸入輸出代幣不能相同
40018INVALID_SLIPPAGE滑點值無效使用有效的滑點值
40019SLIPPAGE_TOO_LOW滑點過低滑點必須大於零
40020POOL_NOT_SUPPORTED流動性池不支援使用支援的交易池
40021UNSUPPORTED_SWAP_MODE交換模式不支援使用支援的交換模式
40022FEE_PARAMETER_ERROR手續費引數錯誤檢查手續費配置
40023ANTI_MEV_REJECTEDAnti-MEV 驗證失敗檢查 Anti-MEV 設定
40030POOL_INPUT_MISMATCH池輸入不匹配輸入代幣與池不匹配
{
  "code": 40006,
  "timestamp": "2026-02-05T10:30:00.000Z",
  "message": "Insufficient liquidity",
  "details": {
    "requested_amount": "1000000000",
    "available_liquidity": "500000000"
  }
}

訂單相關錯誤

錯誤碼名稱說明解決方案
40035INVALID_MARKET_PRICES市場價格無效檢查價格引數
40036INVALID_ORDER_PARAMETERS訂單引數無效檢查訂單配置

其他客戶端錯誤

錯誤碼名稱說明解決方案
40013PARAMETER_ERROR引數錯誤必須設定總金額或固定金額
40024NOT_IMPLEMENTED方法未實現使用已實現的方法
40037UNSUPPORTED_VALUE_TYPE值型別不支援使用支援的值型別
40038PARSE_ERROR解析失敗檢查資料格式
40040INVALID_MIGRATE_TYPE遷移型別無效使用有效的遷移型別

認證錯誤 (401)

錯誤碼名稱說明解決方案
401UNAUTHORIZED未授權,Token 缺失或無效檢查 Authorization 頭
{
  "code": 401,
  "timestamp": "2026-02-05T10:30:00.000Z",
  "message": "Unauthorized. Token is missing or invalid"
}
處理示例
if (error.code === 401) {
  // 重新获取 Token
  const newToken = await getAccessToken();
  // 使用新 Token 重试请求
}

許可權錯誤 (403)

錯誤碼名稱說明解決方案
403FORBIDDEN禁止訪問見下方說明
40301INSUFFICIENT_PERMISSIONS許可權不足獲取必要的許可權
403 錯誤可能由以下原因觸發:
  • 用量配額耗盡:賬戶月度 API 呼叫配額已用完,需升級套餐或等待下月重置
  • 請求被黑名單:IP 或賬戶被加入黑名單
  • 未在白名單:請求來源未在允許的白名單中
當 API 用量配額耗盡時,閘道器會直接返回 403 狀態碼。這與 429(速率限制)不同:
  • 429:短期速率限制(每秒/每分鐘請求數超限)
  • 403:賬戶配額限制(月度用量耗盡)或許可權問題
{
  "code": 403,
  "timestamp": "2026-02-05T10:30:00.000Z",
  "message": "Forbidden"
}
{
  "code": 40301,
  "timestamp": "2026-02-05T10:30:00.000Z",
  "message": "Insufficient permissions",
  "details": {
    "required_scope": "kyt.write",
    "current_scopes": ["kyt.read"]
  }
}

資源未找到錯誤 (404)

錯誤碼名稱說明解決方案
404NOT_FOUND資源未找到檢查資源是否存在
40401POOL_NOT_FOUND流動性池未找到檢查池地址和鏈
40402MARKET_INFO_NOT_FOUND市場資訊未找到檢查市場是否存在
40403OPEN_ORDER_NOT_FOUND開放訂單賬戶未找到檢查訂單賬戶
40404ORDER_NOT_FOUND訂單未找到檢查訂單 ID
40405CHAIN_NOT_FOUND鏈未找到使用支援的鏈標識
40406DEX_NOT_FOUNDDEX 未找到使用支援的 DEX
{
  "code": 40401,
  "timestamp": "2026-02-05T10:30:00.000Z",
  "message": "Liquidity pool not found",
  "details": {
    "chain": "sol",
    "pool_address": "INVALID_ADDRESS"
  }
}

速率限制錯誤 (429)

錯誤碼名稱說明解決方案
429RATE_LIMIT請求過多,達到速率限制等待後重試
42901API_USAGE_LIMIT_EXCEEDEDAPI 使用量超限升級套餐或等待重置
42902KYT_USAGE_LIMIT_EXCEEDEDKYT API 使用量超限升級 KYT 套餐
{
  "code": 429,
  "timestamp": "2026-02-05T10:30:00.000Z",
  "message": "Too Many Requests. Rate limit reached",
  "details": {
    "limit": 100,
    "remaining": 0,
    "reset_at": 1706745600
  }
}
處理示例
if (response.status === 429) {
  const retryAfter = response.headers.get('Retry-After') || 1;
  await sleep(retryAfter * 1000);
  // 重试请求
}

伺服器錯誤 (500)

通用伺服器錯誤

錯誤碼名稱說明解決方案
500INTERNAL_SERVER_ERROR內部伺服器錯誤稍後重試
50001UNKNOWN_ERROR未知錯誤聯絡技術支援
50005DATABASE_ERROR資料操作失敗稍後重試
50007EXTERNAL_SERVICE_ERROR外部服務呼叫失敗稍後重試
50029EXTERNAL_API_ERROR外部 API 請求失敗稍後重試

區塊鏈相關錯誤

錯誤碼名稱說明解決方案
50002CHAIN_CONNECTION_ERROR區塊鏈連線錯誤檢查網路狀態
50003CHAIN_SYNC_ERROR區塊鏈同步錯誤等待同步完成
50004TRANSACTION_TIMEOUT交易超時重試或增加超時時間
50006TRANSACTION_ERROR交易錯誤檢查交易引數
50008CHAIN_NOT_SUPPORTED鏈不支援使用支援的鏈
50017INSUFFICIENT_BALANCE餘額不足檢查賬戶餘額
50026TRANSACTION_SEND_FAILED交易傳送失敗檢查網路和引數
50027TRANSACTION_CONFIRMATION_FAILED交易確認失敗檢查交易狀態
50028TRANSACTION_SIGNATURE_EMPTY交易簽名為空新增簽名

DEX 相關錯誤

錯誤碼名稱說明解決方案
50009DEX_NOT_SUPPORTEDDEX 不支援使用支援的 DEX
50010DEX_ROUTE_BUILD_FAILEDDEX 路由構建失敗檢查代幣對流動性
50011DEX_SWAP_BUILD_FAILEDDEX 交換構建失敗檢查交易引數
50012DEX_SWAP_SIMULATED_FAILEDDEX 交換模擬失敗調整交易引數
50019DEX_AGGREGATOR_NOT_FOUNDDEX 聚合器未找到聯絡技術支援
50020DEX_BUILDER_NOT_FOUNDDEX 構建器未找到聯絡技術支援
50033CURVE_CALCULATION_ERROR曲線計算錯誤檢查引數
50034LOOKUP_TABLE_ERROR地址查詢表錯誤稍後重試
50035SWAP_ROUTE_ERROR交換路由計算錯誤檢查代幣對

Jupiter API 錯誤

錯誤碼名稱說明解決方案
50013JUPITER_API_UNAUTHORIZEDJupiter API 未授權檢查 API 金鑰
50014JUPITER_API_RATE_LIMITJupiter API 速率限制稍後重試
50015JUPITER_API_BAD_REQUESTJupiter API 請求錯誤檢查引數
50016JUPITER_API_ERRORJupiter API 錯誤稍後重試

配置和初始化錯誤

錯誤碼名稱說明解決方案
50018PROVIDER_NOT_INITIALIZEDProvider 未初始化配置 rpcUrl
50021ORDER_BUILDER_NOT_FOUND訂單構建器未找到聯絡技術支援
50022MARKET_EXPIRED市場已過期使用有效市場
50023CONFIG_NOT_FOUND配置未找到檢查配置
50030FEE_CONFIGURATION_REQUIRED需要手續費配置配置手續費
50036METAFIELD_NOT_FOUND元欄位未找到檢查後設資料

檔案上傳錯誤

錯誤碼名稱說明解決方案
50024IPFS_UPLOAD_FAILEDIPFS 上傳失敗稍後重試
50025SIGNED_URL_FAILED簽名 URL 建立失敗稍後重試

Bundle 處理錯誤

錯誤碼名稱說明解決方案
50031BUNDLE_PROCESSING_FAILEDBundle 處理失敗檢查 Bundle 配置
50032TIP_ACCOUNTS_NOT_AVAILABLETip 賬戶不可用稍後重試
{
  "code": 50010,
  "timestamp": "2026-02-05T10:30:00.000Z",
  "message": "DEX route build failed",
  "details": {
    "input_token": "So11111111111111111111111111111111111111112",
    "output_token": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
    "reason": "No valid route found"
  }
}

紅包錯誤 (510)

錯誤碼名稱說明解決方案
51000RED_PACKET_INVALID_PARAMETER_ERROR紅包引數錯誤提供紅包 ID 或分享 ID
51001RED_PACKET_NOT_FOUND_ERROR紅包未找到檢查紅包 ID
51002RED_PACKET_WITHDRAWN_ERROR紅包已撤回紅包已不可用
51003RED_PACKET_ALREADY_CLAIMED_ERROR已領取過紅包每人只能領取一次
51004RED_PACKET_TRANSACTION_ERROR紅包交易錯誤稍後重試
{
  "code": 51003,
  "timestamp": "2026-02-05T10:30:00.000Z",
  "message": "You have already claimed this red packet"
}

Webhook 錯誤 (520)

錯誤碼名稱說明解決方案
52000WEBHOOKS_APPLICATION_NOT_FOUNDWebhook 應用未找到檢查 Webhook ID
52001WEBHOOKS_ENDPOINT_LIMIT_REACHEDWebhook 端點數量達到上限刪除不需要的端點
{
  "code": 52001,
  "timestamp": "2026-02-05T10:30:00.000Z",
  "message": "Webhooks endpoint limit reached",
  "details": {
    "current_count": 10,
    "max_allowed": 10
  }
}

錯誤處理最佳實踐

import { ChainStreamClient } from '@chainstream-io/sdk';

const client = new ChainStreamClient(process.env.CHAINSTREAM_ACCESS_TOKEN);

async function safeApiCall(apiFunction) {
  try {
    return await apiFunction();
  } catch (error) {
    const { code, message, details } = error;
    
    // 根据错误码分类处理
    if (code === 401) {
      // 认证错误:重新获取 Token
      await refreshToken();
      return safeApiCall(apiFunction);
    }
    
    if (code === 429 || code === 42901 || code === 42902) {
      // 速率限制:等待后重试
      const retryAfter = details?.reset_at 
        ? (details.reset_at * 1000 - Date.now()) 
        : 1000;
      await sleep(retryAfter);
      return safeApiCall(apiFunction);
    }
    
    if (code >= 40000 && code < 41000) {
      // 客户端参数错误:记录并抛出
      console.error(`Parameter error: ${message}`, details);
      throw new ValidationError(message, details);
    }
    
    if (code >= 40400 && code < 40500) {
      // 资源未找到
      console.warn(`Resource not found: ${message}`);
      return null;
    }
    
    if (code >= 50000) {
      // 服务器错误:记录并重试
      console.error(`Server error: ${message}`, details);
      await sleep(1000);
      return safeApiCall(apiFunction);
    }
    
    // 未知错误
    throw error;
  }
}

// 使用示例
const tokenInfo = await safeApiCall(() => 
  client.token.getToken('sol', 'TOKEN_ADDRESS')
);

GraphQL API 錯誤

GraphQL 查詢的錯誤透過標準 errors 陣列返回。Credit 消耗資訊在 extensions.credits 中報告:
{
  "data": null,
  "errors": [
    {
      "message": "Unknown field 'InvalidField' on type 'DEXTradesRecord'",
      "locations": [{ "line": 3, "column": 5 }]
    }
  ],
  "extensions": {
    "credits": {
      "total": 0,
      "cubes": []
    }
  }
}
場景行為
無效查詢(語法/驗證錯誤)errors 陣列填充,data 為 null,不扣費
成功查詢data 填充,extensions.credits.total 顯示消耗的 CU
Credit 額度超限查詢可能被拒絕(取決於計費計劃),檢查 extensions.credits
詳見 GraphQL 計費與額度瞭解完整的 Credit 計算公式。

WebSocket 錯誤

WebSocket 連線使用端點 wss://realtime-dex.chainstream.io/connection/websocket,透過 ?token= 引數認證。
場景行為
無效 token握手階段連線被拒絕
Token 過期連線斷開;使用新 token 重連
網路中斷客戶端應實現指數退避自動重連
訂閱無效頻道WebSocket 幀返回錯誤訊息
TypeScript SDK(@chainstream-io/sdk)會自動處理 WebSocket 重連。如果使用原生 WebSocket 客戶端,建議實現指數退避重連(1s、2s、4s、8s…)。
詳見 WebSocket API 參考超時與心跳瞭解連線管理詳情。

獲取幫助

如果遇到無法解決的錯誤:

技術支援

傳送郵件並附上錯誤碼和時間戳

Discord 社群

加入社群獲取幫助
報告問題時,請提供完整的錯誤響應(包括 codetimestampmessagedetails)以便我們快速定位問題。