오류 및 거부 사유
오류 코드와 거부 사유의 전체 카탈로그입니다.
오류 응답 형식
HTTP 오류 응답 (미들웨어)
미들웨어에서 반환되는 구조화된 JSON 오류입니다 (HTTP 4xx/5xx):
{
"error": "<code>",
"message": "<human message>"
}
엔진 수준 거부 (HTTP 200)
거래 거부는 HTTP 200과 함께 OrderUpdateMessage.status = "REJECTED"를 반환합니다:
{
"timestamp": 1735000000000,
"info": { ... },
"status": "REJECTED",
"reason": "<exact rejection string>",
"filled_size": 0,
"order_id": null,
"wallet_address": "0x...",
"mmp_triggered": false
}
중요: 거래 거부 여부를 HTTP 상태 코드에 의존하지 마십시오. 항상 status와 reason 필드를 확인하십시오.
미들웨어 오류 코드
다음은 구조화된 JSON 본문과 함께 HTTP 오류 응답으로 반환됩니다.
| 코드 | HTTP 상태 | 설명 |
|---|---|---|
invalid_request | 400 | 요청 본문을 읽을 수 없음 |
invalid_json | 400 | JSON 파싱 실패 |
missing_field | 400 | 필수 필드 누락 |
invalid_wallet | 400 | 지갑 문자열을 파싱할 수 없음 |
invalid_parameter | 400 | 잘못된 파라미터 (예: size/price는 문자열이어야 함) |
signature_verification_failed | 400 | EIP-712 서명 복구 실패 |
unsupported_endpoint | 400 | 미들웨어가 이 경로를 지원하지 않음 |
unauthorized | 401 | 서명자가 지갑에 대한 권한이 없음 (에이전트 인증 실패) |
internal_error | 500 | 에이전트 권한 확인이 예기치 않게 실패함 |
엔진 거부 사유
다음은 status="REJECTED"일 때 OrderUpdateMessage.reason에 나타납니다.
만기된 상품
사유: "Instrument has expired"
원인: 이미 만기된 상품에 주문이 접수되었습니다.
조치: GET /instruments 또는 GET /markets를 통해 상품 만기를 확인하십시오.
자금 미입금 계정
사유: "Account has no funds. Please deposit before trading."
원인: 계정 현금 잔고가 <= 0.0입니다.
조치: 거래 전에 지갑에 USDC를 입금하십시오.
증거금 부족
사유: "Insufficient margin: required={:.2}, available={:.2}, shortfall={:.2}"
예시: "Insufficient margin: required=1500.00, available=1200.00, shortfall=300.00"
원인: 거래 전 증거금 검사에서 제안된 주문 이후의 증거금 요건을 충족하기에 가용 담보(순자산)가 부족한 것으로 확인되었습니다.
Standard Margin 계정의 경우, 필요한 담보는 옵션 방향, 옵션 유형, 행사가격, 기초자산 가격 및 현재 포트폴리오에 따라 달라집니다. 현재 출시 증거금 모델은 Standard Margin을 참조하십시오.
조치:
GET /portfolio?wallet=...를 통해 포트폴리오를 확인하십시오- Margin에서 증거금 계산을 검토하십시오
- 포지션 크기를 줄이거나 담보를 추가하십시오
현물 가격 누락
사유: "Failed to get portfolio: No spot price available for underlying: {underlying}"
원인: 엔진이 체결 시뮬레이션에 필요한 기초자산의 현물 가격을 추론할 수 없습니다.
조치: Hyperliquid 현물 가격 피드 연결 상태를 확인하십시오. 현물 가격은 allMids WebSocket 피드에서 제공됩니다.
티어 제한
사유: "Tier1 users cannot go short. Filled long position: {filled}, total sell orders (including new): {total} (symbol: {symbol})"
원인: 지갑이 tier1(롱 전용)인데 충분한 체결된 롱 포지션 없이 매도를 시도했습니다.
조치:
GET /user-tier?wallet=...를 통해 티어를 확인하십시오- 모든 매도가 체결된 롱 포지션으로 커버되는지 확인하십시오
- 마켓메이커 연동을 위한 매도(writer) 권한이 필요한 경우 Hypercall에 문의하십시오
잘못된 심볼
사유: "Invalid symbol: {symbol}"
원인: 해당 심볼에 대한 호가창이 존재하지 않습니다.
조치:
GET /instrument-specs와GET /markets를 통해 시장이 존재하는지 확인하십시오- 심볼 형식을 확인하십시오:
UNDERLYING-YYYYMMDD-STRIKE-(C|P)
심볼 파싱 오류
사유: "Failed to parse symbol: {detail}"
원인: 심볼이 예상 형식과 일치하지 않습니다.
조치: 심볼 형식이 UNDERLYING-EXPIRY-STRIKE-(C|P) 또는 Deribit 스타일의 DDMMMYY와 일치하는지 확인하십시오.
취소 실패
주문을 찾을 수 없음
사유: "Order not found for cancellation: {client_id}"
원인: 주어진 client_id에 해당하는 주문을 찾을 수 없습니다.
조치: client_id가 올바른지, 그리고 GET /orders?wallet=...를 통해 주문이 존재하는지 확인하십시오.
호가창을 찾을 수 없음
사유: "Orderbook not found for symbol: {symbol}"
원인: 해당 심볼에 대한 호가창이 존재하지 않습니다.
조치: 심볼이 유효하고 시장이 존재하는지 확인하십시오.
주문이 호가창에 없음
사유: "Order {id} not found in orderbook {symbol}"
원인: 주문 ID는 존재하지만 주문이 호가창에 없습니다 (체결 또는 취소되었을 수 있음).
조치: GET /orders?wallet=...를 통해 주문 상태를 확인하십시오.
이미 체결된 주문
사유: "Order {id} is already filled and cannot be cancelled"
원인: 취소 요청 전에 주문이 전량 체결되었습니다.
조치: GET /orders?wallet=...를 통해 주문 상태를 확인하십시오.
이미 취소된 주문
사유: "Order {id} was already cancelled"
원인: 주문이 이미 취소되었습니다.
조치: GET /orders?wallet=...를 통해 주문 상태를 확인하십시오.
무기한 계약 주문 검증
사유: "Perp order missing underlying symbol"
원인: 무기한 계약 주문에 underlying 필드가 포함되어 있지 않습니다.
조치: 무기한 계약 주문에 underlying 심볼이 포함되어 있는지 확인하십시오.
MMP 발동
사유: "MMP triggered during fill processing"
원인: 체결 처리 중 MMP 한도를 초과했습니다. 주문이 부분 체결된 후 MMP가 발동되어 남은 수량이 취소되었습니다.
조치:
GET /mmp-config?wallet=...¤cy=...를 통해 MMP 설정을 확인하십시오- 체결 윈도우 지표를 검토하십시오
- MMP 한도를 조정하거나
POST /mmp-config/reset을 통해 MMP 상태를 초기화하십시오
전체 MMP 동작 방식은 MMP를 참조하십시오.
MMP 취소 (다른 주문)
사유: "Order canceled by MMP trigger"
원인: 동일한 지갑+기초자산에 대한 다른 주문이 MMP를 발동시켜 주문이 취소되었습니다.
조치: MMP 설정과 체결 활동을 검토하십시오.
핸들러 수준 검증 오류
다음은 엔진에 도달하기 전에 HTTP 400을 반환합니다.
가격 검증
오류: "Price validation failed: Price {price} has {n} significant figures, maximum allowed is 5"
원인: 가격이 유효숫자 5자리를 초과합니다.
조치: 가격을 유효숫자 5자리 이하로 반올림하십시오.
수량/가격 형식
오류: "Size must be greater than 0" 또는 "Price must be greater than 0"
원인: 수량 또는 가격이 <= 0이거나 부동소수점으로 파싱할 수 없습니다.
조치: size와 price가 유효한 양수(문자열 형태)인지 확인하십시오.
잘못된 심볼 형식
오류: 핸들러 오류 메시지와 함께 HTTP 400
원인: 심볼이 유효한 옵션 심볼로 파싱되지 않습니다.
조치: 심볼 형식을 확인하십시오: UNDERLYING-YYYYMMDD-STRIKE-(C|P).
대량 주문 오류
대량 주문 엔드포인트는 BulkOrderResult.error에 항목별 오류를 반환합니다:
"Signature verification failed: ...""Unauthorized: signer not authorized for wallet""Price validation failed: ...""Size must be greater than 0""Price must be greater than 0""Failed to send order to engine""No response from engine"
각 결과에는 index(요청 배열에서의 위치)와 success 불리언이 포함됩니다.
WebSocket 오류
WebSocket 제어 메시지:
{
"type": "Error",
"message": "Authentication required for this channel"
}
일반적인 오류:
"Authentication required for this channel":?wallet=없이 비공개 채널 구독을 시도함"Client not found": 내부 오류 (연결 끊김)
오류 처리 모범 사례
- 항상
status필드를 확인하십시오: 거래 거부 여부를 HTTP 상태 코드에 의존하지 마십시오 reason문자열을 파싱하십시오: 프로그래밍 방식 처리에는 정확한 사유 문자열을 사용하십시오- 대량 주문 오류를 처리하십시오: 대량 요청의 각 항목에 대해
BulkOrderResult.error를 확인하십시오 - 재시도 로직:
REJECTED주문은 재시도하지 마십시오 (먼저 근본 원인을 해결하십시오) - 로깅: 거부 디버깅을 위해 전체
OrderUpdateMessage를 로깅하십시오
오류 코드 참조 표
| 거부 사유 | 분류 | HTTP 상태 | 조치 |
|---|---|---|---|
Instrument has expired | 만기 | 200 | 만기 확인, 다른 상품 사용 |
Account has no funds... | 자금 | 200 | 자금 입금 (구현 시) |
Insufficient margin: ... | 증거금 | 200 | 수량 축소, 담보 추가, 포트폴리오 확인 |
Failed to get portfolio: No spot price... | 데이터 | 200 | Hyperliquid 피드 연결 확인 |
Tier1 users cannot go short... | 티어 | 200 | tier2로 업그레이드 또는 매도 커버 |
Invalid symbol: ... | 심볼 | 200 | 시장 존재 여부 확인 |
Order not found for cancellation: ... | 취소 | 200 | 주문 존재 여부 확인 |
Order {id} is already filled... | 취소 | 200 | 주문이 이미 체결됨 |
Order {id} was already cancelled | 취소 | 200 | 주문이 이미 취소됨 |
MMP triggered during fill processing | MMP | 200 | MMP 설정 검토, 한도 조정 |
Order canceled by MMP trigger | MMP | 200 | MMP 설정 검토, 한도 조정 |
signature_verification_failed | 인증 | 400 | 서명, 문자열 인코딩 확인 |
unauthorized | 인증 | 401 | 에이전트 승인 또는 지갑으로 서명 |
Price validation failed: ... | 검증 | 400 | 가격을 유효숫자 5자리 이하로 반올림 |
거부 디버깅
- 주문 상세 확인:
symbol,price,size,side가 올바른지 확인하십시오 - 포트폴리오 확인:
GET /portfolio?wallet=...로 현재 포지션과 현금을 확인하십시오 - 티어 확인:
GET /user-tier?wallet=...로 티어 제한을 확인하십시오 - MMP 확인:
GET /mmp-config?wallet=...¤cy=...로 MMP 한도를 검토하십시오 - 시장 확인:
GET /markets와GET /instruments로 상품이 존재하는지 확인하십시오 - 로그 검토: 서버 로그에 추가 컨텍스트가 포함되어 있을 수 있습니다 (API를 통해 노출되지 않음)
참고
- 거부 로직: 거래 엔진에서 적용됩니다
- 증거금 검사: 주문 접수 전에 적용됩니다
- 티어 검사: 지갑 티어별로 적용됩니다
- 핸들러 검증: 표준 요청 검증