메인 콘텐츠로 건너뛰기

오류 응답 형식

모든 API 오류는 통일된 응답 형식을 따릅니다:
{
  "code": 40001,
  "timestamp": "2026-02-05T10:30:00.000Z",
  "message": "Human readable error message",
  "details": {
    // Optional additional information
  }
}

HTTP 상태 코드

상태설명오류 코드 범위
400Bad Request400, 40001-40040
401Unauthorized401
403Forbidden403, 40301
404Not Found404, 40401-40406
429Too Many Requests429, 42901-42902
500Internal Server Error500, 50001-50036
510Red Packet Error51000-51004
520Webhook Error52000-52001

클라이언트 오류 (400)

파라미터 유효성 검증 오류

코드이름설명해결 방법
400BAD_REQUEST잘못된 요청요청 형식을 확인하세요
40001VALIDATION_ERROR요청 파라미터가 비정상이거나 올바르지 않음파라미터 형식과 값을 확인하세요
40002INVALID_PARAMETER유효하지 않은 파라미터파라미터 값이 요구사항을 충족하는지 확인하세요
40003INVALID_TOKEN유효하지 않은 액세스 토큰토큰 형식을 확인하세요
40004MISSING_PARAMETER필수 파라미터 누락누락된 필수 파라미터를 추가하세요
40005INVALID_ADDRESS유효하지 않은 지갑 주소 형식주소 형식을 확인하세요
40027INVALID_CURSOR유효하지 않은 커서유효한 페이지네이션 커서를 사용하세요
40031INVALID_TIMESTAMP유효하지 않은 타임스탬프 형식ISO 8601 형식을 사용하세요
40032INVALID_RESOLUTION유효하지 않은 해상도 파라미터지원되는 K-line 주기를 사용하세요
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슬리피지가 너무 낮음슬리피지는 0보다 커야 합니다
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파라미터 오류total 또는 fixed 금액을 설정해야 합니다
40024NOT_IMPLEMENTED메서드가 구현되지 않음구현된 메서드를 사용하세요
40037UNSUPPORTED_VALUE_TYPE지원되지 않는 값 타입지원되는 값 타입을 사용하세요
40038PARSE_ERROR파싱 실패데이터 형식을 확인하세요
40040INVALID_MIGRATE_TYPE유효하지 않은 마이그레이션 타입유효한 마이그레이션 타입을 사용하세요

인증 오류 (401)

코드이름설명해결 방법
401UNAUTHORIZED인증되지 않음. 토큰이 누락되었거나 유효하지 않음Authorization 헤더를 확인하세요
{
  "code": 401,
  "timestamp": "2026-02-05T10:30:00.000Z",
  "message": "Unauthorized. Token is missing or invalid"
}
처리 예시:
if (error.code === 401) {
  // Refresh token
  const newToken = await getAccessToken();
  // Retry request with new 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);
  // Retry request
}

서버 오류 (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_SUPPORTED지원되지 않는 DEX지원되는 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_INITIALIZED프로바이더가 초기화되지 않음rpcUrl을 구성하세요
50021ORDER_BUILDER_NOT_FOUND주문 빌더를 찾을 수 없음지원팀에 문의하세요
50022MARKET_EXPIRED시장이 만료됨유효한 시장을 사용하세요
50023CONFIG_NOT_FOUND설정을 찾을 수 없음설정을 확인하세요
50030FEE_CONFIGURATION_REQUIRED수수료 설정 필요수수료를 구성하세요
50036METAFIELD_NOT_FOUND메타필드를 찾을 수 없음메타데이터를 확인하세요

파일 업로드 오류

코드이름설명해결 방법
50024IPFS_UPLOAD_FAILEDIPFS 업로드 실패나중에 재시도하세요
50025SIGNED_URL_FAILED서명된 URL 생성 실패나중에 재시도하세요

번들 처리 오류

코드이름설명해결 방법
50031BUNDLE_PROCESSING_FAILED번들 처리 실패번들 설정을 확인하세요
50032TIP_ACCOUNTS_NOT_AVAILABLE팁 계정 사용 불가나중에 재시도하세요
{
  "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;
    
    // Handle errors by category
    if (code === 401) {
      // Authentication error: refresh token
      await refreshToken();
      return safeApiCall(apiFunction);
    }
    
    if (code === 429 || code === 42901 || code === 42902) {
      // Rate limit: wait and retry
      const retryAfter = details?.reset_at 
        ? (details.reset_at * 1000 - Date.now()) 
        : 1000;
      await sleep(retryAfter);
      return safeApiCall(apiFunction);
    }
    
    if (code >= 40000 && code < 41000) {
      // Client parameter error: log and throw
      console.error(`Parameter error: ${message}`, details);
      throw new ValidationError(message, details);
    }
    
    if (code >= 40400 && code < 40500) {
      // Resource not found
      console.warn(`Resource not found: ${message}`);
      return null;
    }
    
    if (code >= 50000) {
      // Server error: log and retry
      console.error(`Server error: ${message}`, details);
      await sleep(1000);
      return safeApiCall(apiFunction);
    }
    
    // Unknown error
    throw error;
  }
}

// Usage example
const tokenInfo = await safeApiCall(() => 
  client.token.getToken('sol', 'TOKEN_ADDRESS')
);

GraphQL API 오류

GraphQL 쿼리는 표준 errors 배열에 오류를 반환합니다. 크레딧 소비는 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 표시
크레딧 한도 초과결제 플랜에 따라 쿼리가 거부될 수 있음 — extensions.credits 확인
전체 크레딧 계산 공식은 GraphQL 과금 및 크레딧을 참조하세요.

WebSocket 오류

WebSocket 연결은 wss://realtime-dex.chainstream.io/connection/websocket 엔드포인트에 ?token= 인증을 사용합니다.
시나리오동작
유효하지 않은 토큰핸드셰이크에서 연결 거부
토큰 만료연결 끊김; 새 토큰으로 재연결
네트워크 중단클라이언트에서 지수 백오프로 자동 재연결 구현 필요
유효하지 않은 채널 구독WebSocket 프레임에 오류 메시지 반환
TypeScript SDK(@chainstream-io/sdk)는 WebSocket 재연결을 자동으로 처리합니다. 원시 WebSocket 클라이언트를 사용하는 경우, 연결 끊김 시 지수 백오프(1초, 2초, 4초, 8초…)를 구현하세요.
연결 관리에 대한 자세한 내용은 WebSocket API 레퍼런스타임아웃 및 하트비트를 참조하세요.

도움 받기

해결할 수 없는 오류가 발생하면:

기술 지원

오류 코드와 타임스탬프를 포함하여 이메일을 보내주세요

Discord 커뮤니티

커뮤니티에 참여하여 도움을 받으세요
이슈를 보고할 때, 문제를 빠르게 파악할 수 있도록 전체 오류 응답(code, timestamp, message, details 포함)을 제공해 주세요.