개요
요청이 실패하면 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의 결제가 아직 진행 중입니다
- 발생 조건: 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에서 재시도할 수 없습니다
- 발생 조건: invoice에 대한 3회의 전송을 모두 사용했거나 cooldown이 지나기 전의 manual retry(HTTP 429)입니다. 두 번째 전송은 첫 번째 전송 후 1시간, 세 번째 전송은 두 번째 전송 후 3시간을 기다립니다. 본문에는
-
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의 가장 최근 결제가 실패하지 않았습니다
- 발생 조건: 이전 결제가 terminal 상태가 아닌 동안 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_billproration mode를 사용함 - 메시지: do_not_bill proration mode는 customer portal에서 허용되지 않습니다
- 발생 조건: Customer Portal plan change에서
-
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 상태가
-
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와 일치하지 않습니다
- 발생 조건: localized price 형식이 product의
-
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를 설정해야 합니다
- 발생 조건: product의
-
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가
-
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또는specificcode의 allow list에 없음) - 메시지: 고객은 이 discount code를 사용할 수 없습니다
- 발생 조건: 고객이 code의
-
DISCOUNT_MINIMUM_SUBTOTAL_NOT_MET- 발생 조건: cart subtotal이 checkout currency에 설정된
minimum_subtotal보다 낮음 - 메시지: Cart subtotal이 discount에 필요한 minimum subtotal보다 낮습니다
- 발생 조건: cart subtotal이 checkout currency에 설정된
-
DISCOUNT_NOT_YET_ACTIVE- 발생 조건:
starts_at날짜 전에 code를 사용함 - 메시지: Discount code가 아직 활성화되지 않았습니다(starts_at이 미래입니다)
- 발생 조건:
-
DISCOUNT_PER_CUSTOMER_USAGE_LIMIT_EXCEEDED- 발생 조건: 고객이 code를 이미
per_customer_usage_limit회 사용함 - 메시지: 이 discount code의 고객별 사용 한도를 초과했습니다
- 발생 조건: 고객이 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만 지원됩니다
- 발생 조건: 지원되지 않는 discount type입니다.
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 상태가
-
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 오류를 처리할 때 다음 방법을 따르세요:- 애플리케이션에서 모든 오류 응답을 처리하고
message가 아닌code를 기준으로 분기하세요. - 실패한 모든 요청의 HTTP 상태,
code및message를 기록하세요. - 원시 API
message대신 최종 사용자를 위해 작성한 메시지를 표시하세요. 429및5xx응답이나DISCOUNT_CONCURRENT_REDEMPTION와 같은 일시적 오류만 일정 시간 후 재시도하세요.- 해결할 수 없는 오류는 지원팀에 문의하세요.