Skip to main content

개요

요청이 실패하면 Dodo Payments API는 HTTP 상태 코드와 오류를 설명하는 JSON 본문을 반환합니다. 이 페이지에서 오류의 원인과 해결 방법을 확인하세요. 각 오류 응답에는 다음이 포함됩니다:
  • 오류의 일반적인 범주를 나타내는 HTTP 상태 코드입니다.
  • 정확한 오류를 식별하는 code입니다(예: UNSUPPORTED_COUNTRY).
  • 오류를 일반적인 언어로 설명하는 message입니다. message는 예를 들어 내부 서버 오류의 경우 null일 수 있습니다.
code를 기준으로 오류 처리를 분기하고 message를 기준으로 분기하지 마세요. 원인에 따라 여러 메시지를 반환하는 코드도 있습니다. 다음 오류 코드를 사용하여:
  • 통합 문제를 디버깅합니다.
  • 애플리케이션에서 오류를 올바르게 처리합니다.
  • 고객에게 의미 있는 피드백을 표시합니다.
  • 결제 처리를 안정적으로 유지합니다.
이는 API 및 비즈니스 로직 오류입니다. 실패한 결제에서 반환되는 카드 거절 사유(예: INSUFFICIENT_FUNDS 또는 CARD_DECLINED)는 Transaction Failures 참조 문서를 확인하세요.

표준 API 오류 코드

API는 오류에 다음 HTTP 상태 코드를 사용합니다:

오류 응답 형식

오류 응답 본문에는 code 및 message라는 두 필드가 포함됩니다:

오류 코드 참조

아래 오류 코드는 관련된 API 영역별로 그룹화되어 있습니다. 각 항목에는 오류를 발생시키는 조건과 API가 반환하는 메시지가 나열되어 있습니다. {id}와 같은 플레이스홀더는 API가 입력하는 값을 나타냅니다.

인증 및 계정

  • UNAUTHORIZED
    • 발생 조건: 요청에 API 키가 없거나 유효하지 않음(HTTP 401), 또는 API 키에 작업에 필요한 역할이 없음(HTTP 403)
    • 메시지: 이 작업을 수행할 권한이 없습니다
  • MERCHANT_NOT_LIVE
    • 발생 조건: live payments가 활성화되지 않은 비즈니스에 대한 live mode 요청(HTTP 403)입니다. test mode만 사용한 비즈니스와 verification이 완료되지 않아 아직 live payments가 활성화되지 않은 비즈니스가 해당됩니다. test mode 요청에는 영향을 주지 않습니다.
    • 메시지: merchant에 live payments가 활성화되지 않음
  • BUSINESS_ARCHIVED
    • 발생 조건: 보관된 비즈니스에 대한 모든 고객 대상 요청(HTTP 403)입니다. checkout, payment links, storefront, Customer Portal 및 license key activation이 해당됩니다.
    • 메시지: 이 비즈니스는 보관되었으며 더 이상 요청을 받지 않습니다

결제 및 Checkout

  • CHECKOUT_SESSION_CONSUMED
    • 발생 조건: checkout session에서 이미 결제가 생성됨(HTTP 403). 대신 새 checkout session을 생성하세요.
    • 메시지: 지정된 checkout session으로 결제가 이미 생성되었습니다.
  • MANUAL_RETRY_ALREADY_PAID
    • 발생 조건: 결제가 이미 성공한 renewal invoice에 대한 Manual retry입니다. 다시 전송하면 고객에게 이중으로 청구됩니다.
    • 메시지: 이 invoice의 결제가 이미 성공했습니다
  • MANUAL_RETRY_HARD_DECLINE
    • 발생 조건: invoice의 최근 실패가 hard decline이거나 분류된 오류 코드가 없는 경우의 manual retry입니다. 같은 카드로 다시 청구해도 성공할 수 없으므로 payment method를 대신 업데이트하세요.
    • 메시지: 이 invoice의 마지막 실패는 hard decline이므로 재시도할 수 없습니다 (또는) 이 invoice의 마지막 실패를 분류할 수 없으므로 재시도할 수 없습니다
  • MANUAL_RETRY_IN_FLIGHT
    • 발생 조건: invoice의 결제가 processing 상태이거나 아직 기록된 상태가 없는 동안 manual retry를 수행함. 다시 전송하지 말고 해당 결제 결과를 기다리세요.
    • 메시지: 이 invoice의 결제가 아직 진행 중입니다
  • MANUAL_RETRY_LIMIT_REACHED
    • 발생 조건: invoice에 대한 3회의 전송을 모두 사용했거나 cooldown이 지나기 전의 manual retry(HTTP 429)입니다. 두 번째 전송은 첫 번째 전송 후 1시간, 세 번째 전송은 두 번째 전송 후 3시간을 기다립니다. 본문에는 code 및 message만 포함됩니다. 다음 전송이 허용되는 시간을 확인하려면 GET /payments/{payment_id}/retry에서 retry_available_at를 읽으세요.
    • 메시지: 이 invoice에 대한 모든 manual retry를 사용했습니다 (또는) 아직 이 invoice에서 재시도할 수 없습니다
  • NO_ELIGIBLE_PAYMENT_METHODS
    • 발생 조건: 필터링 후 결제에 사용할 수 있는 payment method가 남아 있지 않음(HTTP 422)
    • 메시지: 사용 가능한 payment method를 찾을 수 없습니다
  • PAYMENT_NOT_PERMITTED
    • 발생 조건: merchant의 blocklist에 있는 고객의 checkout 또는 결제 시도(HTTP 403)입니다. 코드와 메시지는 의도적으로 원인을 명시하지 않습니다.
    • 메시지: 이 결제를 처리할 수 없습니다.
  • PAYMENT_NOT_RETRYABLE
    • 발생 조건: manual retry가 지원하지 않는 결제의 manual retry입니다. 결제에 invoice가 없거나, invoice가 open subscription renewal이 아니거나, invoice의 결제가 아직 실패하지 않았거나, subscription에 recurring billing이 구성되지 않았거나(예: on-demand subscription), 고객이 blocklist에 있을 수 있습니다.
    • 메시지: 사유에 따라 다릅니다. 예: subscription renewal 결제만 재시도할 수 있습니다
  • PAYMENT_NOT_SUCCEEDED
    • 발생 조건: 성공하지 않은 결제를 환불하거나 처리하려고 시도함
    • 메시지: 제공된 결제가 성공하지 않았습니다
  • PREVIOUS_PAYMENT_PENDING
    • 발생 조건: 이전 결제가 terminal 상태가 아닌 동안 charge를 생성하려고 시도함. 최신 invoice 결제가 failed도 in flight도 아닌 경우의 manual retry에도 반환됩니다(예: requires_customer_action 또는 cancelled).
    • 메시지: 이전 결제가 아직 성공하지 않아 새 charge를 생성할 수 없습니다 (또는) 이 invoice의 가장 최근 결제가 실패하지 않았습니다
  • UNSUCCESSFUL_PAYMENT_ID
    • 발생 조건: payment ID가 성공하지 않은 결제를 참조함
    • 메시지: Payment ID의 상태가 성공하지 않았습니다.

Connector 및 BYOP

이 오류는 merchant가 소유한 payment connector(Bring Your Own Processor 또는 BYOP)와 관련이 있습니다.
  • BYOP_CONNECTOR_DISABLED
    • 발생 조건: 비활성화된 BYOP connector를 통해 라우팅된 subscription의 payment method를 업데이트함. Dodo Payments는 자체 connector로 대체하지 않으므로 먼저 connector를 다시 활성화하세요.
    • 메시지: subscription이 현재 비활성화된 merchant 자체(BYOP) connector를 통해 라우팅되고 있습니다
  • BYOP_CUSTOM_INVOICE_ADDRESS_MISSING
    • 발생 조건: merchant의 connector(BYOP)를 통해 라우팅된 결제에 custom invoice address가 없음
    • 메시지: 결제가 merchant의 connector를 통해 라우팅되는 경우 BYOP custom invoice address가 필요합니다
  • CONNECTOR_LABEL_ALREADY_EXISTS
    • 발생 조건: 이미 존재하는 label로 connector를 생성함
    • 메시지: 이 label의 connector가 이미 존재합니다. 다른 label을 선택하세요.

환불

  • EXISTING_REFUND_REQUEST_PROCESSING
    • 발생 조건: 이전 refund request가 아직 처리 중임
    • 메시지: 상태가 “Pending”인 refund request가 아직 처리 중입니다
  • LINE_ITEM_FULLY_REFUNDED
    • 발생 조건: 이미 전액 환불된 line item을 환불하려고 시도함
    • 메시지: Line item {id}은 전액 환불되어 추가로 환불할 수 없습니다.
  • LINE_ITEM_NOT_FOUND
    • 발생 조건: item ID가 참조된 결제에 포함되지 않음
    • 메시지: 결제에서 line item {id}을 찾을 수 없습니다
  • LINE_ITEM_PRORATED
    • 발생 조건: prorated line item에 대해 환불 또는 업데이트를 시도함
    • 메시지: line item {id}은 prorated이므로 환불할 수 없습니다
  • LINE_ITEM_REFUND_AMOUNT_TOO_HIGH
    • 발생 조건: 세금을 포함한 환불 금액이 지불 금액보다 큼
    • 메시지: line item {id}의 세금 포함 요청 환불 금액 {amount}이 지불 금액 {amount}보다 큽니다
  • LINE_ITEM_REFUND_AMOUNT_TOO_LOW
    • 발생 조건: 환불 금액이 최소 기준 미만임
    • 메시지: line item {id}의 요청 환불 금액 {amount}이 너무 낮습니다
  • NOTHING_TO_REFUND
    • 발생 조건: 모든 양수 line item이 이미 전액 환불되어 환불 가능한 금액이 남아 있지 않음
    • 메시지: 환불 가능한 금액이 남아 있지 않습니다. 모든 양수 line item이 전액 환불되었습니다.
  • PARTIAL_REFUND_NOT_ALLOWED
    • 발생 조건: 전액 환불만 지원하는 payment method에 대해 부분 환불을 시도함
    • 메시지: 이 payment method에서는 부분 환불을 허용하지 않습니다
  • PAYMENT_ALREADY_REFUNDED
    • 발생 조건: 중복 환불
    • 메시지: 이 결제는 이미 환불되었습니다
  • PAYMENT_HAS_BEEN_REFUNDED
    • 발생 조건: 결제가 전액 환불됨
    • 메시지: Payment ID가 전액 환불되었습니다.
  • REFUND_AMOUNT_EXCEEDS_PAID_AMOUNT
    • 발생 조건: 총 환불 금액이 지불 금액보다 큼
    • 메시지: 계산된 환불 금액이 지불 금액보다 큽니다
  • REFUND_WINDOW_EXPIRED
    • 발생 조건: 허용된 환불 기간이 지난 후 환불을 요청함
    • 메시지: 결제 생성 후 {days}일이 지나면 환불을 시작할 수 없습니다. support@dodopayments.com으로 문의하세요.
  • ZERO_AMOUNT_PAYMENT_REFUND_NOT_ALLOWED
    • 발생 조건: 금액이 0인 결제를 환불하려고 시도함
    • 메시지: 통화 금액이 0인 결제는 환불할 수 없습니다

Subscription 및 Add-on

  • ADDONS_IN_USAGE_BASED_BILLING_NOT_SUPPORTED
    • 발생 조건: usage-based billing subscription에 add-on을 추가하려고 시도함
    • 메시지: Usage Based Billing에서는 Subscription의 Addon을 지원하지 않습니다
  • ADDONS_NOT_ALLOWED_FOR_ON_DEMAND
    • 발생 조건: on-demand subscription에 add-on을 추가하려고 시도함
    • 메시지: on demand subscription에는 Addon을 허용하지 않습니다
  • CANCEL_SCHEDULED_PLAN_CHANGE_FOR_CUSTOMER_PORTAL_DISABLED
    • 발생 조건: 비즈니스에서 해당 작업을 비활성화한 상태에서 Customer Portal이 예약된 plan change의 취소를 시도함
    • 메시지: customer portal에서 예약된 plan change 취소가 비활성화되어 있습니다.
  • CHARGE_NOT_ALLOWED_FOR_SCHEDULED_CANCELLATION
    • 발생 조건: 취소가 예약된 subscription에 요금을 청구하려고 시도함
    • 메시지: Subscription 취소가 예약되어 있습니다
  • CUSTOMER_HAS_EXISTING_SUBSCRIPTION
    • 발생 조건: 비즈니스에서 고객당 여러 subscription을 허용하지 않을 때 이미 subscription이 있는 고객에게 subscription을 생성함
    • 메시지: 고객 {id}에게 기존 subscription이 있습니다. 고객당 여러 subscription을 허용하려면 business settings를 변경하세요
  • DO_NOT_BILL_NOT_ALLOWED_IN_CUSTOMER_PORTAL
    • 발생 조건: Customer Portal plan change에서 do_not_bill proration mode를 사용함
    • 메시지: do_not_bill proration mode는 customer portal에서 허용되지 않습니다
  • DUPLICATE_ADDON_IDS_IN_REQUEST
    • 발생 조건: 동일한 addon_id가 요청에 두 번 이상 나타남
    • 메시지: 중복 addon ID는 허용되지 않습니다
  • INACTIVE_SUBSCRIPTION_PLAN_CHANGE_NOT_SUPPORTED
    • 발생 조건: 비활성 subscription에서 plan change를 수행함
    • 메시지: 비활성 subscription에서는 plan을 변경할 수 없습니다
  • INVALID_PRORATION_MODE_WITH_NEXT_BILLING_DATE
    • 발생 조건: effective_at: next_billing_date와 함께 full_immediately 이외의 proration mode를 사용함
    • 메시지: effective_at: next_billing_date에는 full_immediately proration mode만 허용됩니다
  • MISSING_ADDON_IDS
    • 발생 조건: addon_id 목록이 비어 있거나 알 수 없는 ID를 포함함
    • 메시지: 하나 이상의 product ID가 존재하지 않습니다: {id}
  • ON_DEMAND_PLAN_CHANGE_NOT_SUPPORTED
    • 발생 조건: on-demand subscription에서 plan change를 수행함
    • 메시지: on demand subscription에서는 plan을 변경할 수 없습니다
  • ON_DEMAND_USAGE_BASED_BILLING_NOT_SUPPORTED
    • 발생 조건: usage-based billing에서 on-demand subscription을 사용하려고 시도함
    • 메시지: Usage Based Billing에서는 On Demand Subscription을 지원하지 않습니다
  • ONE_TIME_PRODUCTS_NOT_ALLOWED_FOR_ON_DEMAND
    • 발생 조건: on-demand subscription에 one-time product를 추가함
    • 메시지: on demand subscription에는 one-time product를 허용하지 않습니다
  • PENDING_PLAN_CHANGE_EXISTS
    • 발생 조건: 이전 plan change가 아직 결제를 기다리는 동안 새 plan change를 요청함
    • 메시지: 이 subscription에 대해 보류 중인 plan change가 이미 있습니다. 현재 결제가 완료될 때까지 기다리세요.
  • PLAN_CHANGE_FOR_CUSTOMER_PORTAL_DISABLED
    • 발생 조건: 비즈니스에서 비활성화한 상태에서 Customer Portal을 통해 plan change를 수행함
    • 메시지: customer portal의 Subscription plan change가 비활성화되어 있습니다.
  • PLAN_CHANGE_NOT_ALLOWED_FOR_SCHEDULED_CANCELLATION
    • 발생 조건: 취소가 예약된 subscription에서 plan change를 수행함
    • 메시지: Subscription 취소가 예약되어 있습니다
  • SCHEDULE_PLAN_CHANGE_FOR_CUSTOMER_PORTAL_DISABLED
    • 발생 조건: 비즈니스에서 비활성화한 상태에서 Customer Portal을 통해 plan change를 예약함
    • 메시지: 이 비즈니스에서는 plan change 예약이 비활성화되어 있습니다.
  • SCHEDULED_PLAN_CHANGE_EXISTS
    • 발생 조건: 이미 존재하는 예약된 plan change를 생성함
    • 메시지: 이 subscription에 예약된 plan change가 이미 존재합니다. 새로 생성하기 전에 기존 예약 변경을 취소하세요.
  • SCHEDULED_PLAN_CHANGE_NOT_FOUND
    • 발생 조건: 존재하지 않는 예약된 plan change를 참조하거나 취소함
    • 메시지: 이 subscription에 예약된 plan change가 없습니다.
  • SUBSCRIPTION_EXPIRED
    • 발생 조건: expires_at 날짜 이후 subscription에 청구함
    • 메시지: Subscription이 만료되어 새 charge를 생성할 수 없습니다
  • SUBSCRIPTION_HAS_NO_PAYMENT_METHOD
    • 발생 조건: off-session으로 청구할 저장된 payment method가 없는 subscription의 manual retry
    • 메시지: 이 subscription에는 청구할 저장된 payment method가 없습니다
  • SUBSCRIPTION_INACTIVE
    • 발생 조건: subscription 상태가 active가 아님
    • 메시지: Subscription이 활성 상태가 아닙니다 (또는) 이 subscription은 live 상태가 아니므로 취소를 예약할 수 없습니다
  • SUBSCRIPTION_NOT_ON_DEMAND
    • 발생 조건: fixed interval로 청구되는 subscription에서 on-demand 작업을 수행함
    • 메시지: Subscription이 이미 on demand가 아닙니다
  • SUBSCRIPTION_PAYMENT_RETRY_LIMIT_EXCEEDED
    • 발생 조건: subscription payment retry가 최대 시도 횟수를 초과함
    • 메시지: 이 subscription의 최대 재시도 한도인 10회를 초과했습니다

고객 및 Blocklist

  • CUSTOMER_ALREADY_BLOCKED
    • 발생 조건: 이미 blocklist에 있고 취소할 live subscription이 남아 있지 않은 고객을 차단함(HTTP 409)
    • 메시지: 이 고객은 이미 blocklist에 있습니다
  • PORTAL_ACTION_NOT_PERMITTED
    • 발생 조건: 차단된 고객이 Customer Portal write route인 cancel, pause, resume, change plan 또는 update payment method를 호출함(HTTP 403). read route는 계속 열려 있습니다. 코드와 메시지는 의도적으로 원인을 명시하지 않습니다.
    • 메시지: 이 작업은 사용할 수 없습니다.

Product, Cart 및 Brand

  • BRAND_ALREADY_ARCHIVED
    • 발생 조건: 이미 보관된 brand를 보관함
    • 메시지: Brand가 이미 보관되었습니다
  • BRAND_ARCHIVED
    • 발생 조건: 보관된 brand를 업데이트하거나 verification에 제출하거나 새 product, product collection 또는 subscription을 해당 brand에 연결함
    • 메시지: Brand가 보관되었습니다 (또는) Brand가 보관되어 업데이트할 수 없습니다 (또는) Brand가 보관되어 verification에 제출할 수 없습니다
  • BRAND_ARCHIVE_TARGET_REQUIRED
    • 발생 조건: move_products_to 대상 없이 product, live subscription 또는 product collection을 보유한 brand를 보관함
    • 메시지: Brand에 {count}개의 product가 있습니다. 해당 product에 다시 tag를 지정하려면 move_products_to를 대상 brand로 설정하세요. archive를 차단하는 것이 live subscription 또는 product collection인 경우 메시지에 해당 항목이 대신 표시됩니다.
  • BRAND_MISMATCH
    • 발생 조건: cart item이 서로 다른 brand에 속함
    • 메시지: product cart의 모든 item은 동일한 brand에 속해야 합니다
  • BRAND_NOT_ENABLED
    • 발생 조건: brand가 비활성화되었거나 active 상태가 아님
    • 메시지: 제공된 brand가 활성화되어 있지 않습니다
  • BRAND_SUBMISSION_NOT_ENABLED
    • 발생 조건: brand verification 재제출 기능이 활성화되지 않음
    • 메시지: Brand verificatin resubmission is not enabled (API가 반환하는 정확한 철자)
  • CANNOT_ARCHIVE_PRIMARY_BRAND
    • 발생 조건: brand ID가 business ID인 primary brand를 보관함
    • 메시지: primary brand는 보관할 수 없습니다
  • FILE_IN_USE
    • 발생 조건: active entitlement grant가 여전히 참조하는 digital product file을 삭제함
    • 메시지: Digital file이 active grant에서 참조되고 있습니다
  • INVALID_BRAND_ARCHIVE_TARGET
    • 발생 조건: move_products_to가 보관 중인 brand, 이미 보관된 brand 또는 다른 business의 brand를 지정함
    • 메시지: move_products_to는 보관되지 않은 이 business의 brand여야 합니다 (또는) move_products_to는 보관하려는 brand일 수 없습니다
  • INVALID_SUGGESTED_PRICE
    • 발생 조건: Pay What You Want suggested price가 minimum price보다 낮음
    • 메시지: Suggested Price는 minimum price보다 낮을 수 없습니다. pay what you want의 경우 price는 허용되는 minimum amount로 간주됩니다
  • LOCALIZED_PRICE_ALREADY_EXISTS
    • 발생 조건: 이 product와 country 또는 currency에 대한 localized price가 이미 존재함
    • 메시지: 이 product와 country/currency에 대한 localized price가 이미 존재합니다
  • LOCALIZED_PRICE_DUPLICATES_BASE
    • 발생 조건: localized price가 product의 base currency 또는 country와 중복됨
    • 메시지: Localized price가 product의 base currency/country와 중복됩니다
  • LOCALIZED_PRICE_SHAPE_MISMATCH
    • 발생 조건: localized price 형식이 product의 pricing_mode와 일치하지 않음
    • 메시지: Localized price 형식이 product의 pricing_mode와 일치하지 않습니다
  • MISSING_PRODUCT_INFORMATION
    • 발생 조건: product는 존재하지만 필수 정보가 누락됨
    • 메시지: Product {id}은 존재하지만 다른 필수 정보가 누락되었거나 유효하지 않습니다
  • PAY_AS_YOU_WANT_AMOUNT_REQUIRED
    • 발생 조건: Pay What You Want product의 amount가 누락됨
    • 메시지: pay as you want product에는 amount가 필수입니다
  • PRODUCT_CART_EMTPY
    • 발생 조건: 비어 있는 product cart를 제출함
    • 메시지: product_cart가 비어 있습니다(오류 코드는 API가 반환하는 정확한 값과 일치하도록 의도적으로 EMTPY로 표기됨)
  • PRODUCT_COLLECTION_IS_DELETED
    • 발생 조건: 삭제된 product collection에서 작업함
    • 메시지: 메시지 없음
  • PRODUCT_COLLECTION_MUST_HAVE_PRODUCTS
    • 발생 조건: collection에서 마지막 product 또는 product가 포함된 마지막 group을 제거함
    • 메시지: Collection의 마지막 product는 삭제할 수 없습니다. 대신 collection을 archive하세요. (또는) Product가 포함된 마지막 group은 삭제할 수 없습니다. 대신 collection을 archive하세요.
  • PRODUCT_IS_DELETED
    • 발생 조건: product가 삭제됨
    • 메시지: 메시지 없음
  • PRODUCT_PRICING_MODE_REQUIRED
    • 발생 조건: product의 pricing_mode가 설정되기 전에 localized price를 추가함
    • 메시지: localized price를 추가하기 전에 product pricing_mode를 설정해야 합니다
  • SLUG_ALREADY_TAKEN
    • 발생 조건: 요청한 product slug 또는 short URL이 이미 사용 중임
    • 메시지: Slug이 이미 사용 중입니다
  • UNABLE_TO_EDIT_PRIMARY_BRAND
    • 발생 조건: 일반 brand API를 통해 primary brand를 업데이트하려고 시도함
    • 메시지: Primary brand는 이 API endpoint를 통해 업데이트할 수 없습니다.

Discount

  • DISCOUNT_ALREADY_USED_ON_SUBSCRIPTION
    • 발생 조건: 이 subscription에 이미 사용된 discount를 다시 적용함
    • 메시지: 이 discount는 이 subscription에 이미 사용되었습니다
  • DISCOUNT_CODE_ALREADY_EXISTS
    • 발생 조건: 이미 존재하는 discount code를 생성함
    • 메시지: Discount Code가 이미 존재합니다
  • DISCOUNT_CODE_EXPIRED
    • 발생 조건: discount code가 expires_at 날짜를 지남
    • 메시지: Discount code가 만료되었습니다
  • DISCOUNT_CODE_USAGE_LIMIT_EXCEEDED
    • 발생 조건: usage_limit에 도달한 후 discount code를 사용함
    • 메시지: Usage limit은 times_used보다 작을 수 없습니다 (또는) Discount code가 usage limit에 도달했습니다
    • 참고: Terminal입니다. code를 모두 사용했으므로 재시도하지 마세요.
  • DISCOUNT_CONCURRENT_REDEMPTION
    • 발생 조건: 동일 code의 다른 redemption이 usage-limit lock을 너무 오래 유지함(HTTP 503)
    • 메시지: Discount가 동시에 redemption되고 있습니다. 다시 시도하세요
    • 참고: 일시적인 오류입니다. code에 아직 용량이 남아 있을 수 있으므로 요청을 안전하게 재시도할 수 있습니다. 고객에게 code가 소진되었다고 표시하지 마세요.
  • DISCOUNT_CURRENCY_OPTION_INVALID
    • 발생 조건: 생성 또는 업데이트 시 유효하지 않은 currency_options
    • 메시지: flat discount에는 확인 가능한 default가 있는 currency option이 하나 이상 필요합니다 (또는) 중복 currency option은 허용되지 않습니다 (또는) default로 표시할 수 있는 currency option은 하나뿐입니다
  • DISCOUNT_CUSTOMER_NOT_ELIGIBLE
    • 발생 조건: 고객이 code의 customer_eligibility을 충족하지 않음(first_time, existing 또는 specific code의 allow list에 없음)
    • 메시지: 고객은 이 discount code를 사용할 수 없습니다
  • DISCOUNT_MINIMUM_SUBTOTAL_NOT_MET
    • 발생 조건: cart subtotal이 checkout currency에 설정된 minimum_subtotal보다 낮음
    • 메시지: Cart subtotal이 discount에 필요한 minimum subtotal보다 낮습니다
  • DISCOUNT_NOT_YET_ACTIVE
    • 발생 조건: starts_at 날짜 전에 code를 사용함
    • 메시지: Discount code가 아직 활성화되지 않았습니다(starts_at이 미래입니다)
  • DISCOUNT_PER_CUSTOMER_USAGE_LIMIT_EXCEEDED
    • 발생 조건: 고객이 code를 이미 per_customer_usage_limit회 사용함
    • 메시지: 이 discount code의 고객별 사용 한도를 초과했습니다
  • DISCOUNT_NOT_APPLICABLE_TO_NEW_PRODUCT
    • 발생 조건: 기존 discount가 적용되지 않는 product로 plan change를 수행함
    • 메시지: Discount가 새 plan의 product에 적용되지 않습니다
  • DISCOUNT_NOT_AVAILABLE_FOR_ON_DEMAND
    • 발생 조건: on-demand subscription에 code를 적용함
    • 메시지: on demand subscription에서는 discount coupon을 사용할 수 없습니다
  • DISCOUNT_NOT_AVAILABLE_FOR_PRODUCT
    • 발생 조건: 적용 대상이 아닌 product에 code를 적용함
    • 메시지: 이 product에서는 discount coupon을 사용할 수 없습니다
  • INVALID_DISCOUNT_CODE
    • 발생 조건: code가 존재하지 않거나 cart의 어떤 product에도 적용되지 않음
    • 메시지: 유효하지 않은 Discount Code입니다 (또는) Cart의 어떤 product에도 Discount Code를 적용할 수 없습니다
  • INVALID_PERCENTAGE
    • 발생 조건: percentage가 100%(10,000 basis points)보다 높음
    • 메시지: Percentage amount는 10000보다 클 수 없습니다 (또는) Discount code amount는 100%보다 클 수 없습니다
  • UNSUPPORTED_DISCOUNT_TYPE
    • 발생 조건: 지원되지 않는 discount type입니다. percentage 및 flat는 모두 지원되지만 per-unit amount discount는 지원되지 않습니다.
    • 메시지: Percentage 및 flat discount code만 지원됩니다 (또는) 현재는 percentage discount code만 지원됩니다

License Key

  • ACTIVATION_LIMIT_LESS_THAN_CURRENT_AMOUNT
    • 발생 조건: license key의 새 activation limit이 현재 instance 수보다 낮음
    • 메시지: 새 activation limit은 현재 instance 수보다 작을 수 없습니다
  • INACTIVE_LICENSE_KEY
    • 발생 조건: license key 상태가 active가 아님
    • 메시지: License key가 active 상태가 아닙니다
  • LICENSE_KEY_LIMIT_REACHED
    • 발생 조건: activation 수가 activation limit에 도달함
    • 메시지: License key activation limit에 도달했습니다
  • LICENSE_KEY_NOT_FOUND
    • 발생 조건: instance ID 또는 license key ID가 유효하지 않음
    • 메시지: License key instance를 찾을 수 없거나 이 license key에 속하지 않습니다
  • NO_EXPIRY_ON_SUBSCRIPTION_LICENSE_KEYS
    • 발생 조건: subscription-based license key에 만료일을 설정하려고 시도함
    • 메시지: Subscription-based license key에는 만료일을 설정할 수 없습니다

Usage-Based Billing 및 Meter

  • DUPLICATE_METER_IDS_IN_REQUEST
    • 발생 조건: 동일한 meter ID가 요청에 두 번 이상 나타남
    • 메시지: 중복 Meter ID는 허용되지 않습니다
  • INVALID_QUANTITY
    • 발생 조건: usage-based pricing product에 대해 1이 아닌 quantity를 사용함
    • 메시지: usage based price product에서는 quantity를 1만 허용합니다
  • METER_IS_DELETED
    • 발생 조건: 삭제된 meter를 사용하려고 시도함
    • 메시지: Meter가 이미 삭제되었습니다
  • MISSING_METER_IDS
    • 발생 조건: meter ID 목록이 비어 있거나 유효하지 않은 ID를 포함함
    • 메시지: 하나 이상의 meter ID가 존재하지 않습니다: {id}

Credit-Based Billing

  • CREDIT_ENTITLEMENT_IS_DELETED
    • 발생 조건: 삭제된 credit entitlement에서 작업함
    • 메시지: Credit entitlement가 이미 삭제되었습니다
  • CREDIT_ENTITLEMENT_NAME_ALREADY_EXISTS
    • 발생 조건: 이미 존재하는 이름으로 credit entitlement를 생성함
    • 메시지: 이 이름의 credit entitlement가 이미 존재합니다
  • OVERAGE_LIMIT_EXCEEDED
    • 발생 조건: usage 또는 credit deduction이 설정된 overage limit을 초과함
    • 메시지: Overage limit을 초과했습니다

Wallet

  • INSUFFICIENT_WALLET_FUNDS
    • 발생 조건: wallet balance가 debit amount보다 낮음
    • 메시지: Wallet에 잔액이 부족합니다
  • NEGATIVE_BALANCE_ADJUSTMENT
    • 발생 조건: wallet balance를 음수로 만들려고 시도함
    • 메시지: Wallet balance를 음수로 만들 수 없습니다

Currency, Tax 및 Region

  • EXCHANGE_RATE_NOT_FOUND
    • 발생 조건: currency pair에 대한 exchange rate가 없음
    • 메시지: {currency}에서 {currency}로 변환할 exchange rate를 찾을 수 없습니다
  • INVALID_TAX_ID
    • 발생 조건: VAT, GST 또는 TIN validation에 실패함
    • 메시지: Tax Id가 유효하지 않습니다
  • REQUEST_AMOUNT_BELOW_MINIMUM
    • 발생 조건: amount가 product에 설정된 minimum보다 낮음
    • 메시지: Amount는 product에 지정된 minimum amount보다 작을 수 없습니다
  • TOTAL_PAYMENT_AMOUNT_BELOW_MINIMUM_AMOUNT
    • 발생 조건: 결제 처리에 필요한 minimum amount보다 combined cart total이 낮음
    • 메시지: 결제를 처리하려면 최소 {display_str}가 필요합니다
  • UNSUPPORTED_BILLING_CURRENCY
    • 발생 조건: 요청한 billing currency가 이 subscription에서 지원되지 않음
    • 메시지: Subscription에서는 USD가 아닌 billing currency를 지원하지 않습니다
  • UNSUPPORTED_COUNTRY
    • 발생 조건: country가 지원되지 않음
    • 메시지: 현재 country {country_name}는 지원되지 않습니다
  • UNSUPPORTED_CURRENCY
    • 발생 조건: product 또는 add-on currency가 Dodo Payments에서 청구할 수 있는 통화가 아님. Base price는 청구 가능한 모든 통화로 설정할 수 있으므로, 이 오류는 대개 currency code가 유효하지 않거나 지원되지 않음을 의미합니다.
    • 메시지: 현재 Currency가 지원되지 않습니다 (또는) 현재 USD 및 INR product만 지원됩니다 (또는) Addon price에는 현재 USD 및 INR만 지원됩니다 (또는) billing_currency에는 USD 또는 INR만 요청할 수 있습니다 (또는) Currency가 지원되지 않습니다 (또는) Indian card subscription에 예기치 않은 currency입니다
  • UNSUPPORTED_TAX_CATEGORY
    • 발생 조건: tax category가 지원되는 값 중 하나가 아님
    • 메시지: Category {category}는 현재 지원되지 않습니다

Validation 및 요청

  • DUPLICATE_LINE_ITEMS_IN_REQUEST
    • 발생 조건: 동일한 item_id가 items[]에 두 번 이상 나타남
    • 메시지: items array에 중복 item_ids가 지정되었습니다
  • INVALID_QUERY_PARAMS
    • 발생 조건: 서로 배타적이거나 형식이 잘못된 query parameter
    • 메시지: Query params에는 time_frame 또는 (start, end) 중 하나만 포함해야 합니다 (또는) 범위의 start는 end 이후일 수 없습니다
  • INVALID_REQUEST_BODY
    • 발생 조건: 형식이 잘못된 JSON 또는 schema 위반
    • 메시지: 요청 본문이 유효하지 않습니다. 요청 headers 및 object를 확인하세요.
  • INVALID_REQUEST_PARAMETERS
    • 발생 조건: 형식은 유효하지만 의미상 유효하지 않은 parameter 값(예: 과거 날짜)
    • 메시지: next_billing_date를 과거 시간으로 변경할 수 없습니다
  • MAXIMUM_KEYS_REACHED
    • 발생 조건: Metadata 또는 custom fields가 50개의 key-value pair를 초과함
    • 메시지: 50개의 key-value pair를 초과했습니다

일반 및 시스템

  • INTEGER_CONVERSION_FAILURE
    • 발생 조건: integer와 string 또는 decimal 간 server-side conversion에 실패함(예: cart total이 너무 커서 처리할 수 없음)
    • 메시지: Integer Conversion Failure (또는) Cart total이 너무 커서 처리할 수 없습니다. quantity를 줄이거나 다른 billing currency를 선택하세요.
  • INTERNAL_SERVER_ERROR
    • 발생 조건: 예기치 않은 server error입니다. 요청 세부 정보를 자체 시스템에 기록하세요.
    • 메시지: 공개 메시지 없음(일반적인 500의 경우 message는 보통 null)
  • NOT_FOUND
    • 발생 조건: 누락된 모든 resource에 대한 일반적인 404
    • 메시지: Item을 찾을 수 없습니다 (또는 누락된 항목을 명시하는 더 구체적인 메시지)
  • TOO_MANY_REQUESTS
    • 발생 조건: rate limit을 초과함(HTTP 429)
    • 메시지: 메시지 없음
  • UNSUPPORTED_ACTION
    • 발생 조건: resource type이 지원하지 않는 작업
    • 메시지: usage based subscription에서는 plan 변경을 지원하지 않습니다

모범 사례

API 오류를 처리할 때 다음 방법을 따르세요:
  1. 애플리케이션에서 모든 오류 응답을 처리하고 message가 아닌 code를 기준으로 분기하세요.
  2. 실패한 모든 요청의 HTTP 상태, code 및 message를 기록하세요.
  3. 원시 API message 대신 최종 사용자를 위해 작성한 메시지를 표시하세요.
  4. 429 및 5xx 응답이나 DISCOUNT_CONCURRENT_REDEMPTION와 같은 일시적 오류만 일정 시간 후 재시도하세요.
  5. 해결할 수 없는 오류는 지원팀에 문의하세요.

지원

오류 코드 또는 통합 문제에 대한 추가 도움이 필요하면 support@dodopayments.com으로 지원팀에 문의하세요.
마지막 수정일 2026년 9월 26일