跳转到主要内容

错误响应格式

所有 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')
);

获取帮助

如果遇到无法解决的错误:
报告问题时,请提供完整的错误响应(包括 codetimestampmessagedetails)以便我们快速定位问题。