오류

HIOBuy는 프로토콜 오류(비 2xx + error)와 비즈니스 실패(일부 주문 라우트에서 HTTP 200 + success: false) 두 형태를 사용합니다.

Protocol errors (HTTP 4xx / 5xx) {#protocol-errors}

{
  "error": {
    "code": "INBOUND_VALIDATION_FAILED",
    "message": "Some inbound information is missing or invalid.",
    "request_id": "req_abc123",
    "category": "VALIDATION_ERROR",
    "field": "tracking_number",
    "details": {
      "fields": [
        {
          "field": "items[0].name",
          "code": "REQUIRED",
          "message": "Product name is required."
        }
      ]
    }
  }
}
FieldDescription
error.codeMachine-readable enum — use for branching logic
error.messageHuman-readable explanation (English)
error.request_idSame as x-request-id response header
error.categoryCoarse grouping: AUTH_ERROR, RATE_LIMIT_ERROR, VALIDATION_ERROR, CHANNEL_ERROR, INTERNAL_ERROR
error.fieldOptional primary field path related to this error
error.detailsOptional object; validation may include details.fields: [{ field, code, message }]
error.upstreamOptional vendor error summary on CHANNEL_UPSTREAM_ERROR (sanitized)

Field-level details.fields[].code values: REQUIRED | INVALID_VALUE | INVALID_FORMAT | OUT_OF_RANGE.

HTTP status principles

HTTPWhen
400Unparseable JSON / generic validation
401Invalid API key
403Authenticated but not allowed (including fulfillment mode gate)
404Missing or inaccessible resource
409State / uniqueness conflict
422Parsed body fails business validation
429Rate limit / quota
500 / 502 / 503Internal or upstream failure

오류 코드 참조 {#error-codes}

정규 카탈로그: data/errors.catalog.json. 요약:

CodeHTTPCategoryWhen
INVALID_API_KEY401AUTH_ERROR잘못되었거나 누락된 Bearer 토큰
UNAUTHORIZED401AUTH_ERRORAPI 키 누락/무효
CHANNEL_NOT_AUTHORIZED401AUTH_ERROR앱에 채널 미인가
FORBIDDEN403AUTH_ERROR키는 유효하나 권한 없음
INSUFFICIENT_SCOPE403AUTH_ERROR라우트에 필요한 scope 부족
CHANNEL_NOT_ENABLED403AUTH_ERROR앱에 채널 미활성
CHANNEL_AUTH_REQUIRED403AUTH_ERROR채널 인가 미완료
CHANNEL_AUTH_EXPIRED403AUTH_ERROR채널 인가 만료 — Portal에서 재인가
CHANNEL_AUTH_REVOKED403AUTH_ERROR채널 인가 취소됨
FULFILLMENT_MODE_NOT_SUPPORTED403AUTH_ERRORself 앱에서 /v1/fulfillment/* 호출
FULFILLMENT_ACCESS_REQUIRED403AUTH_ERROR(예약) 풀필먼트 액세스 없음
FULFILLMENT_ACCESS_SUSPENDED403AUTH_ERROR(예약) 풀필먼트 액세스 정지
WAREHOUSE_AUTH_REQUIRED403AUTH_ERROR창고 풀필먼트인데 창고 인가 없음
WAREHOUSE_AUTH_EXPIRED403AUTH_ERROR창고 인가 만료
WAREHOUSE_AUTH_INVALID403AUTH_ERRORWarehouse rejected developer authentication
VALIDATION_ERROR400VALIDATION_ERROR본문 필드 누락/무효, 미지원 통화
UNSUPPORTED_CHANNEL400VALIDATION_ERROR알 수 없는 channel 값
UNSUPPORTED_FIELD400VALIDATION_ERROR이 라우트에서 허용되지 않는 필드
NOT_FOUND404VALIDATION_ERROR라우트 또는 리소스 없음
CHANNEL_CAPABILITY_NOT_SUPPORTED400CHANNEL_ERROR이 채널에서 지원하지 않음
CHANNEL_UPSTREAM_ERROR502CHANNEL_ERROR마켓플레이스 거부(마스킹)
WAREHOUSE_UPSTREAM_ERROR502CHANNEL_ERROR창고/풀필먼트 업스트림 실패(마스킹)
INTERNAL_ERROR500INTERNAL_ERRORGateway 내부 오류 — 백오프 재시도
RATE_LIMIT_EXCEEDED429RATE_LIMIT_ERROR분당/버스트 한도 초과
QUOTA_EXCEEDED429RATE_LIMIT_ERROR일일 채널 쿼터 소진
PLATFORM_QUOTA_EXCEEDED429RATE_LIMIT_ERROR플랫폼 월간 용량 한도
PAYMENT_DECLINED402VALIDATION_ERROR결제 거절
PAYMENT_INSUFFICIENT_FUNDS402VALIDATION_ERROR잔액 부족(구매 결제)
ORDER_ALREADY_PAID409VALIDATION_ERROR이미 결제된 주문
ORDER_CANCELLED409VALIDATION_ERROR이미 취소된 주문
PRODUCT_UNAVAILABLE422VALIDATION_ERROR상품 판매 불가/판매 중지
IDEMPOTENCY_CONFLICT409VALIDATION_ERRORexternal_shipment_id/멱등 키 충돌
EXTERNAL_ORDER_ID_ALREADY_EXISTS409VALIDATION_ERROR앱 내 external_order_id 이미 사용
PARCEL_NOT_FOUND404VALIDATION_ERROR무효이거나 미입고 parcel
INVALID_SHIPPING_CHANNEL400VALIDATION_ERROR잘못된 shipping_channel_code
INSUFFICIENT_BALANCE402VALIDATION_ERROR풀필먼트 지갑 잔액 부족
SHIPMENT_ALREADY_PAID409VALIDATION_ERRORInternational shipment already paid
SHIPMENT_NOT_FOUND404VALIDATION_ERRORShipment missing or not owned
SHIPMENT_NOT_INTERCEPTABLE409VALIDATION_ERRORCurrent shipment state cannot request intercept
SHIPMENT_INTERCEPTION_ALREADY_REQUESTED409VALIDATION_ERRORIntercept already requested
INVALID_INTERCEPTION_REASON422VALIDATION_ERRORIntercept reason CODE is invalid
INTERCEPTION_REMARK_REQUIRED422VALIDATION_ERRORremark required when reason is OTHER
SHIPMENT_CREATE_EXCEPTION400VALIDATION_ERRORCreate refused (missing item attributes, parcel not inbound, etc. — read message)
SHIPMENT_NOT_CANCELLABLE409VALIDATION_ERRORShipment cannot be cancelled in current status
SHIPMENT_ALREADY_CANCELLED409VALIDATION_ERRORShipment already cancelled
PACKAGE_ALREADY_CONSOLIDATED409VALIDATION_ERRORParcel already in another shipment
INBOUND_TRACKING_ALREADY_SHIPPED409VALIDATION_ERROR이미 출고된 패키지에 연결된 운송장
INBOUND_TRACKING_ALREADY_EXISTS409VALIDATION_ERROR운송장 이미 등록
INBOUND_VALIDATION_FAILED422VALIDATION_ERROR입고 필드 검증 실패(details.fields)
INBOUND_NOT_FOUND404VALIDATION_ERRORInbound 없음/권한 없음
PACKAGE_NOT_FOUND404VALIDATION_ERROR패키지 없음/권한 없음
INBOUND_NOT_EDITABLE409VALIDATION_ERROR현재 상태에서 수정 불가
INBOUND_ALREADY_RECEIVED409VALIDATION_ERROR창고 이미 입고
INBOUND_PACKAGE_MISMATCH409VALIDATION_ERROR지정 inbound/패키지에 연결 불가
INVALID_TRACKING_NUMBER422VALIDATION_ERROR운송장 형식 무효
PACKAGE_COUNT_INVALID422VALIDATION_ERRORpackage_count 무효
TOTAL_VALUE_INVALID422VALIDATION_ERRORtotal_value 무효
UNSUPPORTED_CURRENCY422VALIDATION_ERROR미지원 통화(입고: CNY/USD/KRW)
UNCLAIMED_PACKAGE_NOT_FOUND404VALIDATION_ERROR미클레임 패키지 없음
TRACKING_NUMBER_MISMATCH422VALIDATION_ERROR클레임 정확 일치 실패
PACKAGE_ALREADY_CLAIMED409VALIDATION_ERROR이미 클레임됨
PACKAGE_NOT_CLAIMABLE409VALIDATION_ERROR현재 상태 클레임 불가
CLAIM_ATTEMPTS_EXCEEDED429RATE_LIMIT_ERROR동일 ucp_* 실패 과다
RETURN_NOT_FOUND404VALIDATION_ERROR반품 없음/권한 없음
RETURN_NOT_CONFIRMABLE409VALIDATION_ERROR현재 상태 확인 불가
RETURN_NOT_CANCELLABLE409VALIDATION_ERROR현재 상태 취소 불가
RETURN_ALREADY_RETURNED409VALIDATION_ERROR이미 반품됨
RETURN_ALREADY_CANCELLED409VALIDATION_ERROR이미 취소/무효
RETURN_FEE_NOT_READY409VALIDATION_ERROR반품 비용 미산정
RETURN_FEE_CHANGED409VALIDATION_ERROR확인 금액≠fee.total
PACKAGE_NOT_RETURNABLE409VALIDATION_ERROR패키지 상태상 반품 불가
INVALID_RETURN_REASON422VALIDATION_ERROR알 수 없는 반품 사유 코드
INVALID_RETURN_ADDRESS422VALIDATION_ERRORseller_return 주소 무효
RETURN_VALIDATION_FAILED422VALIDATION_ERROR반품 필드 검증 실패
VALUE_ADDED_SERVICE_NOT_FOUND422VALIDATION_ERROR알 수 없는 VAS 코드
VALUE_ADDED_SERVICE_UNAVAILABLE422VALIDATION_ERRORVAS 존재하나 이용 불가
VALUE_ADDED_SERVICE_INVALID_STAGE422VALIDATION_ERROR이 단계에서 VAS 불가
VALUE_ADDED_SERVICE_QUANTITY_INVALID422VALIDATION_ERRORVAS 수량 무효
SERVICE_REQUEST_NOT_FOUND404VALIDATION_ERROR서비스 요청 없음
RESOURCE_NOT_FOUND404VALIDATION_ERROR관련 리소스 없음
RESOURCE_NOT_ELIGIBLE_FOR_SERVICE409VALIDATION_ERROR서비스 대상 아님
SERVICE_FEE_NOT_READY409VALIDATION_ERROR서비스 요금 미준비
SERVICE_FEE_CHANGED409VALIDATION_ERROR확인 금액≠서비스 요금
SERVICE_REQUEST_VALIDATION_FAILED422VALIDATION_ERROR서비스 요청 필드 검증 실패
TRANSACTION_NOT_FOUND404VALIDATION_ERROR거래 없음/권한 없음
INVOICE_NOT_FOUND404VALIDATION_ERROR인보이스 없음/권한 없음
TRANSACTION_NOT_INVOICEABLE409VALIDATION_ERROR청구 불가 거래
TRANSACTION_ALREADY_INVOICED409VALIDATION_ERROR이미 청구됨
TRANSACTION_INVOICE_PENDING409VALIDATION_ERROR청구 처리 중
INVOICE_NOT_DOWNLOADABLE409VALIDATION_ERROR미발행 — 다운로드 불가
INVOICE_VALIDATION_FAILED422VALIDATION_ERROR인보이스 요청 검증 실패
INVOICE_CURRENCY_MISMATCH422VALIDATION_ERROR인보이스 통화 불일치
INVALID_INVOICE_TITLE422VALIDATION_ERROR인보이스 타이틀 무효
INVALID_TAX_NUMBER422VALIDATION_ERROR세금번호 무효
INVALID_BILLING_ADDRESS422VALIDATION_ERRORbilling_address missing or invalid
TICKET_NOT_FOUND404VALIDATION_ERROR티켓 없음/앱 미소속
TICKET_NOT_REPLYABLE409VALIDATION_ERROR회신 불가(종료 등)
TICKET_ALREADY_CLOSED409VALIDATION_ERROR티켓 이미 종료
INVALID_TICKET_CATEGORY422VALIDATION_ERROR티켓 카테고리 무효
INVALID_TICKET_PRIORITY422VALIDATION_ERROR티켓 우선순위 무효
INVALID_RELATED_RESOURCE422VALIDATION_ERRORrelated_resource 유형 무효
TICKET_VALIDATION_FAILED422VALIDATION_ERROR티켓 필드 검증 실패
RELATED_RESOURCE_NOT_FOUND404VALIDATION_ERROR관련 비즈니스 리소스 없음/권한 없음
MESSAGE_REQUIRED422VALIDATION_ERROR메시지 본문 필수
MESSAGE_TOO_LONG422VALIDATION_ERROR메시지 10000자 초과

Business failures (HTTP 200) {#business-failures}

Procurement preview/create/pay may return HTTP 200 with success: false when the marketplace refuses the operation but the Gateway request was valid.

{
  "channel": "1688",
  "success": false,
  "code": "ORDER_CREATE_FAILED",
  "message": "One or more lines could not be purchased.",
  "failed_offers": [
    {
      "offer_id": "...",
      "spec_id": "...",
      "error_code": "STOCK_NOT_ENOUGH",
      "error_message": "Insufficient stock"
    }
  ],
  "request_id": "req_..."
}
  • Check success before treating the call as completed
  • Inspect unavailable_lines (preview) or failed_offers (create)
  • Partial success: 1688 may return success: true with non-empty failed_offers

Product upstream failures {#upstream-product-errors}

Invalid Taobao口令, missing product, or vendor timeouts on product routes typically return 502 with CHANNEL_UPSTREAM_ERROR — not an empty product shell.

  1. Log request_id on every error path.
  2. Retry 429 and 500 with exponential backoff; do not retry 400 / 401 without fixing input.
  3. On 502 CHANNEL_UPSTREAM_ERROR, surface vendor message to ops; optionally retry once for transient outages.
  4. Order create: use external_order_id / Taobao outer_purchase_id for idempotency — see Procurement orders.

Get Support

Need integration help? Contact Developer Support at support@hiobuy.com · Response within 1–2 business days

Email support