Ikhtisar
Ketika suatu permintaan gagal, Dodo Payments API mengembalikan kode status HTTP dan body JSON yang menyebutkan error tersebut. Gunakan halaman ini untuk menemukan penyebab error dan cara mengatasinya. Setiap respons error mencakup:- Kode status HTTP yang menunjukkan kategori umum error.
- A
codeyang mengidentifikasi error secara tepat, misalnyaUNSUPPORTED_COUNTRY. - A
messageyang menjelaskan error dengan bahasa sederhana.messagedapat berupanull, misalnya untuk internal server errors.
code sebagai dasar penanganan error, bukan message. Beberapa kode mengembalikan lebih dari satu pesan, bergantung pada penyebabnya.
Gunakan kode error ini untuk:
- Men-debug masalah integrasi.
- Menangani error dengan benar dalam aplikasi Anda.
- Menampilkan feedback yang bermakna kepada pelanggan.
- Menjaga pemrosesan pembayaran tetap andal.
Ini adalah error API dan logika bisnis. Untuk alasan penolakan kartu yang dikembalikan pada pembayaran yang gagal (seperti
INSUFFICIENT_FUNDS atau CARD_DECLINED), lihat referensi Transaction Failures.Kode Error API Standar
API menggunakan kode status HTTP berikut untuk error:Format Respons Error
Body respons error berisi dua field,code dan message:
Referensi Kode Error
Kode error di bawah ini dikelompokkan berdasarkan area API yang terkait. Setiap entri mencantumkan kondisi yang memicu error dan pesan yang dikembalikan API. Placeholder seperti{id} mewakili nilai yang diisi oleh API.
Autentikasi & Akun
-
UNAUTHORIZED- Pemicu: Permintaan tidak memiliki API key atau menggunakan API key yang tidak valid (HTTP 401), atau API key tidak memiliki peran yang diperlukan oleh tindakan tersebut (HTTP 403)
- Pesan: Anda tidak diizinkan untuk melakukan tindakan ini
-
MERCHANT_NOT_LIVE- Pemicu: Permintaan live mode untuk bisnis yang belum mengaktifkan live payments (HTTP 403). Ini mencakup bisnis yang hanya pernah menggunakan test mode, serta bisnis yang live payments-nya belum diaktifkan karena verifikasi belum selesai. Permintaan test mode tidak terpengaruh.
- Pesan: Live payments belum diaktifkan untuk merchant
-
BUSINESS_ARCHIVED- Pemicu: Permintaan apa pun yang ditujukan kepada pelanggan untuk bisnis yang diarsipkan (HTTP 403). Ini mencakup checkout, payment links, storefront, Customer Portal, dan aktivasi license key.
- Pesan: Bisnis ini telah diarsipkan dan tidak lagi menerima permintaan
Pembayaran & Checkout
-
CHECKOUT_SESSION_CONSUMED- Pemicu: Checkout session sudah menghasilkan pembayaran (HTTP 403). Buat checkout session baru.
- Pesan: Pembayaran dengan checkout session yang diberikan sudah dibuat.
-
MANUAL_RETRY_ALREADY_PAID- Pemicu: Percobaan ulang manual atas renewal invoice yang pembayarannya sudah berhasil. Mengirimkannya lagi akan menagih pelanggan dua kali.
- Pesan: Pembayaran untuk invoice ini sudah berhasil
-
MANUAL_RETRY_HARD_DECLINE- Pemicu: Percobaan ulang manual ketika kegagalan terbaru pada invoice merupakan hard decline, atau tidak memiliki error code yang diklasifikasikan. Penagihan lain pada kartu yang sama tidak akan berhasil, jadi perbarui payment method.
- Pesan: Kegagalan terakhir pada invoice ini adalah hard decline, sehingga percobaan ulang tidak dapat berhasil (atau) Kegagalan terakhir pada invoice ini tidak dapat diklasifikasikan, sehingga tidak dapat dicoba ulang
-
MANUAL_RETRY_IN_FLIGHT- Pemicu: Percobaan ulang manual saat pembayaran pada invoice berstatus
processingatau belum memiliki status yang tercatat. Tunggu hasil pembayaran tersebut, jangan mengirimkannya lagi. - Pesan: Pembayaran pada invoice ini masih sedang diproses
- Pemicu: Percobaan ulang manual saat pembayaran pada invoice berstatus
-
MANUAL_RETRY_LIMIT_REACHED- Pemicu: Percobaan ulang manual setelah seluruh 3 pengiriman pada invoice digunakan, atau sebelum cooldown berakhir (HTTP 429). Pengiriman kedua menunggu 1 jam setelah pengiriman pertama, dan pengiriman ketiga menunggu 3 jam setelah pengiriman kedua. Body hanya membawa
codedanmessage. Untuk mengetahui kapan pengiriman berikutnya diizinkan, bacaretry_available_atdariGET /payments/{payment_id}/retry. - Pesan: Semua percobaan ulang manual untuk invoice ini telah digunakan (atau) Percobaan ulang sekarang belum tersedia untuk invoice ini
- Pemicu: Percobaan ulang manual setelah seluruh 3 pengiriman pada invoice digunakan, atau sebelum cooldown berakhir (HTTP 429). Pengiriman kedua menunggu 1 jam setelah pengiriman pertama, dan pengiriman ketiga menunggu 3 jam setelah pengiriman kedua. Body hanya membawa
-
NO_ELIGIBLE_PAYMENT_METHODS- Pemicu: Tidak ada payment method yang tetap tersedia untuk pembayaran setelah filtering (HTTP 422)
- Pesan: Tidak ditemukan payment method yang memenuhi syarat
-
PAYMENT_NOT_PERMITTED- Pemicu: Checkout atau percobaan pembayaran oleh pelanggan yang ada di blocklist merchant (HTTP 403). Kode dan pesan sengaja tidak menyebutkan penyebabnya.
- Pesan: Pembayaran ini tidak dapat diproses.
-
PAYMENT_NOT_RETRYABLE- Pemicu: Percobaan ulang manual atas pembayaran yang tidak dicakup oleh percobaan ulang manual. Pembayaran tidak memiliki invoice, invoice-nya bukan renewal subscription yang terbuka, belum ada pembayaran pada invoice yang gagal, subscription tidak memiliki recurring billing yang dikonfigurasi (misalnya subscription on-demand), atau pelanggan ada di blocklist.
- Pesan: Berbeda-beda menurut penyebabnya, misalnya: Hanya pembayaran renewal subscription yang dapat dicoba ulang
-
PAYMENT_NOT_SUCCEEDED- Pemicu: Upaya untuk mengembalikan dana atau memproses pembayaran yang belum berhasil
- Pesan: Pembayaran yang diberikan belum berhasil
-
PREVIOUS_PAYMENT_PENDING- Pemicu: Upaya membuat charge saat pembayaran sebelumnya berada dalam status non-terminal. Juga dikembalikan untuk percobaan ulang manual ketika pembayaran terbaru pada invoice bukan
failedmaupun sedang berlangsung, misalnyarequires_customer_actionataucancelled. - Pesan: Tidak dapat membuat charge baru karena pembayaran sebelumnya belum berhasil (atau) Pembayaran terbaru pada invoice ini belum gagal
- Pemicu: Upaya membuat charge saat pembayaran sebelumnya berada dalam status non-terminal. Juga dikembalikan untuk percobaan ulang manual ketika pembayaran terbaru pada invoice bukan
-
UNSUCCESSFUL_PAYMENT_ID- Pemicu: Payment ID merujuk pada pembayaran yang belum berhasil
- Pesan: Payment ID memiliki status tidak berhasil.
Connector & BYOP
Error ini berkaitan dengan payment connector milik merchant (Bring Your Own Processor, atau BYOP).-
BYOP_CONNECTOR_DISABLED- Pemicu: Memperbarui payment method subscription yang dirutekan melalui connector BYOP yang dinonaktifkan. Dodo Payments tidak beralih ke connector miliknya sendiri, jadi aktifkan kembali connector terlebih dahulu.
- Pesan: Subscription dirutekan melalui connector milik merchant sendiri (BYOP) yang saat ini dinonaktifkan
-
BYOP_CUSTOM_INVOICE_ADDRESS_MISSING- Pemicu: Pembayaran yang dirutekan melalui connector merchant (BYOP) tidak memiliki alamat invoice kustom
- Pesan: Alamat invoice kustom BYOP diperlukan ketika pembayaran dirutekan melalui connector merchant
-
CONNECTOR_LABEL_ALREADY_EXISTS- Pemicu: Membuat connector dengan label yang sudah ada
- Pesan: Connector dengan label ini sudah ada. Pilih label lain.
Refund
-
EXISTING_REFUND_REQUEST_PROCESSING- Pemicu: Permintaan refund sebelumnya masih diproses
- Pesan: Permintaan refund dengan status “Pending” masih diproses
-
LINE_ITEM_FULLY_REFUNDED- Pemicu: Upaya melakukan refund atas line item yang sudah sepenuhnya direfund
- Pesan: Line item
{id}telah sepenuhnya direfund dan tidak dapat direfund lagi.
-
LINE_ITEM_NOT_FOUND- Pemicu: ID item bukan bagian dari pembayaran yang dirujuk
- Pesan: Line item
{id}tidak ditemukan dalam pembayaran
-
LINE_ITEM_PRORATED- Pemicu: Refund atau pembaruan dicoba pada line item yang diprorata
- Pesan: Line item
{id}tidak dapat direfund karena bersifat prorata
-
LINE_ITEM_REFUND_AMOUNT_TOO_HIGH- Pemicu: Jumlah refund, termasuk pajak, lebih besar daripada jumlah yang dibayar
- Pesan: Jumlah refund yang diminta untuk line item
{id}termasuk pajak adalah{amount}, melebihi jumlah yang dibayar{amount}
-
LINE_ITEM_REFUND_AMOUNT_TOO_LOW- Pemicu: Jumlah refund berada di bawah ambang minimum
- Pesan: Jumlah refund yang diminta untuk line item
{id}adalah{amount}, terlalu rendah
-
NOTHING_TO_REFUND- Pemicu: Tidak ada jumlah yang dapat direfund karena semua line item positif sudah sepenuhnya direfund
- Pesan: Tidak ada jumlah yang tersisa untuk direfund. Semua line item positif telah sepenuhnya direfund.
-
PARTIAL_REFUND_NOT_ALLOWED- Pemicu: Refund sebagian dicoba pada payment method yang hanya mendukung refund penuh
- Pesan: Refund sebagian tidak diizinkan untuk payment method ini
-
PAYMENT_ALREADY_REFUNDED- Pemicu: Refund duplikat
- Pesan: Pembayaran ini sudah direfund
-
PAYMENT_HAS_BEEN_REFUNDED- Pemicu: Pembayaran telah sepenuhnya direfund
- Pesan: Payment ID telah sepenuhnya direfund.
-
REFUND_AMOUNT_EXCEEDS_PAID_AMOUNT- Pemicu: Total jumlah refund lebih besar daripada jumlah yang dibayar
- Pesan: Jumlah refund yang dihitung lebih besar daripada jumlah yang dibayar
-
REFUND_WINDOW_EXPIRED- Pemicu: Refund diminta di luar jangka waktu refund yang diizinkan
- Pesan: Refund tidak dapat dimulai
{days}hari setelah pembuatan pembayaran. Hubungi support@dodopayments.com.
-
ZERO_AMOUNT_PAYMENT_REFUND_NOT_ALLOWED- Pemicu: Upaya melakukan refund atas pembayaran dengan jumlah nol
- Pesan: Tidak dapat melakukan refund atas pembayaran dengan jumlah mata uang nol
Subscription & Add-on
-
ADDONS_IN_USAGE_BASED_BILLING_NOT_SUPPORTED- Pemicu: Upaya menambahkan add-on ke subscription berbasis penggunaan
- Pesan: Add-on dalam Subscription tidak didukung untuk Usage Based Billing
-
ADDONS_NOT_ALLOWED_FOR_ON_DEMAND- Pemicu: Upaya menambahkan add-on ke subscription on-demand
- Pesan: Add-on tidak diizinkan untuk subscription on-demand
-
CANCEL_SCHEDULED_PLAN_CHANGE_FOR_CUSTOMER_PORTAL_DISABLED- Pemicu: Customer Portal mencoba membatalkan perubahan plan terjadwal saat bisnis menonaktifkan tindakan tersebut
- Pesan: Pembatalan perubahan plan terjadwal dinonaktifkan untuk customer portal.
-
CHARGE_NOT_ALLOWED_FOR_SCHEDULED_CANCELLATION- Pemicu: Upaya menagih subscription yang dijadwalkan untuk dibatalkan
- Pesan: Subscription dijadwalkan untuk dibatalkan
-
CUSTOMER_HAS_EXISTING_SUBSCRIPTION- Pemicu: Membuat subscription untuk pelanggan yang sudah memilikinya, ketika bisnis tidak mengizinkan beberapa subscription per pelanggan
- Pesan: Pelanggan
{id}memiliki subscription yang sudah ada. Untuk mengizinkan beberapa subscription per pelanggan, ubah pengaturan bisnis
-
DO_NOT_BILL_NOT_ALLOWED_IN_CUSTOMER_PORTAL- Pemicu: Mode proration
do_not_billdigunakan dalam perubahan plan Customer Portal - Pesan: Mode proration do_not_bill tidak diizinkan di customer portal
- Pemicu: Mode proration
-
DUPLICATE_ADDON_IDS_IN_REQUEST- Pemicu:
addon_idyang sama muncul lebih dari sekali dalam permintaan - Pesan: ID add-on duplikat tidak diizinkan
- Pemicu:
-
INACTIVE_SUBSCRIPTION_PLAN_CHANGE_NOT_SUPPORTED- Pemicu: Perubahan plan pada subscription yang tidak aktif
- Pesan: Perubahan plan tidak didukung untuk subscription yang tidak aktif
-
INVALID_PRORATION_MODE_WITH_NEXT_BILLING_DATE- Pemicu: Mode proration selain
full_immediatelydigunakan bersamaeffective_at: next_billing_date - Pesan: Hanya mode proration full_immediately yang diizinkan dengan effective_at: next_billing_date
- Pemicu: Mode proration selain
-
MISSING_ADDON_IDS- Pemicu: Daftar
addon_idkosong atau berisi ID yang tidak dikenal - Pesan: Satu atau beberapa ID produk tidak ada:
{id}
- Pemicu: Daftar
-
ON_DEMAND_PLAN_CHANGE_NOT_SUPPORTED- Pemicu: Perubahan plan pada subscription on-demand
- Pesan: Perubahan plan tidak didukung untuk subscription on-demand
-
ON_DEMAND_USAGE_BASED_BILLING_NOT_SUPPORTED- Pemicu: Upaya menggunakan subscription on-demand dengan Usage Based Billing
- Pesan: On Demand Subscriptions tidak didukung untuk Usage Based Billing
-
ONE_TIME_PRODUCTS_NOT_ALLOWED_FOR_ON_DEMAND- Pemicu: Produk satu kali ditambahkan ke subscription on-demand
- Pesan: Produk satu kali tidak diizinkan untuk subscription on-demand
-
PENDING_PLAN_CHANGE_EXISTS- Pemicu: Perubahan paket baru diminta saat perubahan sebelumnya masih menunggu pembayaran. Untuk mengganti perubahan tautan pembayaran yang tertunda, tetapkan
cancel_older_payment_link: true. - Pesan: Perubahan paket yang tertunda sudah ada untuk subscription ini. Harap tunggu hingga pembayaran saat ini selesai.
- Pemicu: Perubahan paket baru diminta saat perubahan sebelumnya masih menunggu pembayaran. Untuk mengganti perubahan tautan pembayaran yang tertunda, tetapkan
-
PLAN_CHANGE_FOR_CUSTOMER_PORTAL_DISABLED- Pemicu: Perubahan plan melalui Customer Portal saat bisnis menonaktifkannya
- Pesan: Perubahan plan subscription untuk customer portal dinonaktifkan.
-
PLAN_CHANGE_LINK_CANCEL_FAILED- Pemicu: Perubahan paket dengan
cancel_older_payment_link: truetidak dapat membatalkan tautan pembayaran sebelumnya. Tidak ada yang berubah, jadi Anda dapat mencoba kembali permintaan tersebut. - Pesan: Tidak dapat membatalkan tautan pembayaran sebelumnya. Coba lagi.
- Pemicu: Perubahan paket dengan
-
PLAN_CHANGE_NOT_ALLOWED_FOR_SCHEDULED_CANCELLATION- Pemicu: Perubahan paket pada subscription yang dijadwalkan untuk dibatalkan
- Pesan: Subscription dijadwalkan untuk dibatalkan
-
PLAN_CHANGE_PAYMENT_ALREADY_COMPLETED- Pemicu: Perubahan paket dengan
cancel_older_payment_link: truesaat customer sudah membayar perubahan paket sebelumnya. Perubahan tersebut akan diterapkan, jadi jangan mencoba kembali. - Pesan: Customer sudah membayar perubahan paket sebelumnya. Perubahan tersebut akan segera diterapkan.
- Pemicu: Perubahan paket dengan
-
PLAN_CHANGE_PAYMENT_IN_PROGRESS- Pemicu: Perubahan paket dengan
cancel_older_payment_link: truesaat customer sedang membayar perubahan paket sebelumnya, misalnya selama 3D Secure. Coba kembali setelah pembayaran selesai atau gagal. - Pesan: Customer sedang membayar perubahan paket sebelumnya. Coba lagi nanti.
- Pemicu: Perubahan paket dengan
-
SCHEDULE_PLAN_CHANGE_FOR_CUSTOMER_PORTAL_DISABLED- Pemicu: Menjadwalkan perubahan paket melalui Customer Portal saat bisnis menonaktifkan fitur tersebut
- Pesan: Penjadwalan perubahan paket dinonaktifkan untuk bisnis ini.
-
SCHEDULED_PLAN_CHANGE_EXISTS- Pemicu: Membuat perubahan paket terjadwal saat perubahan seperti itu sudah ada
- Pesan: Perubahan paket terjadwal sudah ada untuk subscription ini. Batalkan perubahan terjadwal yang ada sebelum membuat perubahan baru.
-
SCHEDULED_PLAN_CHANGE_NOT_FOUND- Pemicu: Merujuk atau membatalkan perubahan paket terjadwal yang tidak ada
- Pesan: Tidak ditemukan perubahan paket terjadwal untuk subscription ini.
-
SUBSCRIPTION_EXPIRED- Pemicu: Menagih subscription setelah tanggal
expires_at - Pesan: Subscription kedaluwarsa, tidak dapat membuat tagihan baru
- Pemicu: Menagih subscription setelah tanggal
-
SUBSCRIPTION_HAS_NO_PAYMENT_METHOD- Pemicu: Mencoba kembali secara manual subscription yang tidak memiliki metode pembayaran tersimpan untuk ditagih off-session
- Pesan: Subscription ini tidak memiliki metode pembayaran tersimpan untuk ditagih
-
SUBSCRIPTION_INACTIVE- Pemicu: Status subscription bukan
active - Pesan: Subscription tidak aktif (atau) Subscription ini tidak live, sehingga pembatalan tidak dapat dijadwalkan
- Pemicu: Status subscription bukan
-
SUBSCRIPTION_NOT_ON_DEMAND- Pemicu: Tindakan on-demand pada subscription yang ditagih dalam interval tetap
- Pesan: Subscription sudah bukan on-demand
-
SUBSCRIPTION_PAYMENT_RETRY_LIMIT_EXCEEDED- Pemicu: Percobaan pembayaran subscription melebihi jumlah maksimum percobaan
- Pesan: Batas maksimum 10 percobaan untuk subscription ini telah terlampaui
Customer & Blocklist
-
CUSTOMER_ALREADY_BLOCKED- Pemicu: Memblokir customer yang sudah ada di blocklist dan tidak memiliki subscription live yang tersisa untuk dibatalkan (HTTP 409)
- Pesan: Customer ini sudah ada di blocklist
-
PORTAL_ACTION_NOT_PERMITTED- Pemicu: Customer yang diblokir memanggil route penulisan Customer Portal: membatalkan, menjeda, melanjutkan, mengubah paket, atau memperbarui metode pembayaran (HTTP 403). Route baca tetap terbuka. Kode dan pesan sengaja tidak menyebutkan penyebabnya.
- Pesan: Tindakan ini tidak tersedia.
Produk, Cart & Brand
-
BRAND_ALREADY_ARCHIVED- Pemicu: Mengarsipkan brand yang sudah diarsipkan
- Pesan: Brand sudah diarsipkan
-
BRAND_ARCHIVED- Pemicu: Memperbarui brand yang diarsipkan, mengirimkannya untuk verifikasi, atau menandai produk, koleksi produk, atau subscription baru ke brand tersebut
- Pesan: Brand diarsipkan (atau) Brand diarsipkan dan tidak dapat diperbarui (atau) Brand diarsipkan dan tidak dapat dikirimkan untuk verifikasi
-
BRAND_ARCHIVE_TARGET_REQUIRED- Pemicu: Mengarsipkan brand yang masih memiliki produk, subscription live, atau koleksi produk tanpa target
move_products_to - Pesan: Brand memiliki
{count}produk. Tetapkan move_products_to ke brand target untuk menandainya kembali. Pesan akan menyebutkan subscription live atau koleksi produk jika hal tersebut yang menghalangi pengarsipan.
- Pemicu: Mengarsipkan brand yang masih memiliki produk, subscription live, atau koleksi produk tanpa target
-
BRAND_MISMATCH- Pemicu: Item cart berasal dari brand yang berbeda
- Pesan: Semua item dalam product cart harus berasal dari brand yang sama
-
BRAND_NOT_ENABLED- Pemicu: Brand dinonaktifkan atau tidak aktif
- Pesan: Brand yang diberikan tidak diaktifkan
-
BRAND_SUBMISSION_NOT_ENABLED- Pemicu: Fitur pengiriman ulang verifikasi brand tidak diaktifkan
- Pesan:
Brand verificatin resubmission is not enabled(dieja persis seperti yang dikembalikan API)
-
CANNOT_ARCHIVE_PRIMARY_BRAND- Pemicu: Mengarsipkan brand utama, yang ID brand-nya merupakan ID bisnis
- Pesan: Brand utama tidak dapat diarsipkan
-
FILE_IN_USE- Pemicu: Menghapus file produk digital yang masih dirujuk oleh grant entitlement aktif
- Pesan: File digital dirujuk oleh grant aktif
-
INVALID_BRAND_ARCHIVE_TARGET- Pemicu:
move_products_tomenyebutkan brand yang sedang diarsipkan, brand yang telah diarsipkan, atau brand milik bisnis lain - Pesan: move_products_to harus berupa brand milik bisnis ini yang tidak diarsipkan (atau) move_products_to tidak boleh berupa brand yang Anda arsipkan
- Pemicu:
-
INVALID_SUGGESTED_PRICE- Pemicu: Harga yang disarankan untuk Pay What You Want lebih rendah daripada harga minimum
- Pesan: Suggested Price tidak boleh lebih rendah daripada minimum price. Dalam kasus pay what you want, price dianggap sebagai jumlah minimum yang diterima
-
LOCALIZED_PRICE_ALREADY_EXISTS- Pemicu: Harga terlokalisasi sudah ada untuk produk dan negara atau currency ini
- Pesan: Harga terlokalisasi untuk produk dan negara/currency ini sudah ada
-
LOCALIZED_PRICE_DUPLICATES_BASE- Pemicu: Harga terlokalisasi menduplikasi currency atau negara dasar produk
- Pesan: Harga terlokalisasi menduplikasi currency/negara dasar produk
-
LOCALIZED_PRICE_SHAPE_MISMATCH- Pemicu: Bentuk harga terlokalisasi tidak sesuai dengan
pricing_modeproduk - Pesan: Bentuk harga terlokalisasi tidak sesuai dengan pricing_mode produk
- Pemicu: Bentuk harga terlokalisasi tidak sesuai dengan
-
MISSING_PRODUCT_INFORMATION- Pemicu: Produk ada, tetapi informasi wajib tidak lengkap
- Pesan: Produk
{id}ada, tetapi informasi wajib lainnya tidak lengkap atau tidak valid
-
PAY_AS_YOU_WANT_AMOUNT_REQUIRED- Pemicu: Jumlah tidak ada untuk produk Pay What You Want
- Pesan: Jumlah wajib diisi untuk produk pay as you want
-
PRODUCT_CART_EMTPY- Pemicu: Product cart kosong dikirimkan
- Pesan: product_cart kosong (kode error sengaja dieja
EMTPYagar sesuai dengan nilai persis yang dikembalikan API)
-
PRODUCT_COLLECTION_IS_DELETED- Pemicu: Mengoperasikan koleksi produk yang telah dihapus
- Pesan: Tidak ada pesan
-
PRODUCT_COLLECTION_MUST_HAVE_PRODUCTS- Pemicu: Menghapus produk terakhir, atau grup terakhir yang memiliki produk, dari koleksi
- Pesan: Tidak dapat menghapus produk terakhir dalam koleksi. Arsipkan koleksi sebagai gantinya. (atau) Tidak dapat menghapus grup terakhir yang memiliki produk. Arsipkan koleksi sebagai gantinya.
-
PRODUCT_IS_DELETED- Pemicu: Produk telah dihapus
- Pesan: Tidak ada pesan
-
PRODUCT_PRICING_MODE_REQUIRED- Pemicu: Menambahkan harga terlokalisasi sebelum
pricing_modeproduk ditetapkan - Pesan: pricing_mode produk harus ditetapkan sebelum menambahkan harga terlokalisasi
- Pemicu: Menambahkan harga terlokalisasi sebelum
-
SLUG_ALREADY_TAKEN- Pemicu: Slug produk atau short URL yang diminta sudah digunakan
- Pesan: Slug sudah digunakan
-
UNABLE_TO_EDIT_PRIMARY_BRAND- Pemicu: Upaya memperbarui brand utama melalui API brand biasa
- Pesan: Brand utama tidak dapat diperbarui melalui API endpoint ini.
Diskon
-
DISCOUNT_ALREADY_USED_ON_SUBSCRIPTION- Pemicu: Menerapkan kembali diskon yang sudah digunakan pada subscription ini
- Pesan: Diskon ini sudah digunakan pada subscription ini
-
DISCOUNT_CODE_ALREADY_EXISTS- Pemicu: Membuat kode diskon yang sudah ada
- Pesan: Discount Code sudah ada
-
DISCOUNT_CODE_EXPIRED- Pemicu: Kode diskon telah melewati tanggal
expires_at - Pesan: Kode diskon kedaluwarsa
- Pemicu: Kode diskon telah melewati tanggal
-
DISCOUNT_CODE_USAGE_LIMIT_EXCEEDED- Pemicu: Kode diskon digunakan setelah
usage_limittercapai - Pesan: Batas penggunaan tidak boleh kurang dari times_used (atau) Kode diskon telah mencapai batas penggunaan
- Catatan: Terminal. Kode telah habis, jadi jangan mencoba kembali.
- Pemicu: Kode diskon digunakan setelah
-
DISCOUNT_CONCURRENT_REDEMPTION- Pemicu: Penukaran kode yang sama oleh pihak lain menahan lock batas penggunaan terlalu lama (HTTP 503)
- Pesan: Diskon sedang ditukarkan secara bersamaan; coba lagi
- Catatan: Transien. Kode mungkin masih memiliki kapasitas, jadi permintaan aman untuk dicoba kembali. Jangan tampilkan ini kepada customer sebagai kode yang telah habis.
-
DISCOUNT_CURRENCY_OPTION_INVALID- Pemicu:
currency_optionstidak valid saat pembuatan atau pembaruan - Pesan: Diskon flat memerlukan setidaknya satu opsi currency dengan default yang dapat ditentukan (atau) Opsi currency duplikat tidak diizinkan (atau) Hanya satu opsi currency yang dapat ditandai sebagai default
- Pemicu:
-
DISCOUNT_CUSTOMER_NOT_ELIGIBLE- Pemicu: Customer tidak memenuhi
customer_eligibilitykode (first_time,existing, atau tidak ada dalam allow list kodespecific) - Pesan: Customer tidak memenuhi syarat untuk kode diskon ini
- Pemicu: Customer tidak memenuhi
-
DISCOUNT_MINIMUM_SUBTOTAL_NOT_MET- Pemicu: Subtotal cart berada di bawah
minimum_subtotalyang dikonfigurasi untuk currency checkout - Pesan: Subtotal cart berada di bawah subtotal minimum yang diperlukan oleh diskon
- Pemicu: Subtotal cart berada di bawah
-
DISCOUNT_NOT_YET_ACTIVE- Pemicu: Kode digunakan sebelum tanggal
starts_at - Pesan: Kode diskon belum aktif (starts_at berada di masa depan)
- Pemicu: Kode digunakan sebelum tanggal
-
DISCOUNT_PER_CUSTOMER_USAGE_LIMIT_EXCEEDED- Pemicu: Customer sudah menukarkan kode sebanyak
per_customer_usage_limitkali - Pesan: Batas penggunaan per customer terlampaui untuk kode diskon ini
- Pemicu: Customer sudah menukarkan kode sebanyak
-
DISCOUNT_NOT_APPLICABLE_TO_NEW_PRODUCT- Pemicu: Perubahan paket ke produk yang tidak dicakup oleh diskon yang ada
- Pesan: Diskon tidak berlaku untuk produk paket baru
-
DISCOUNT_NOT_AVAILABLE_FOR_ON_DEMAND- Pemicu: Kode diterapkan pada subscription on-demand
- Pesan: Kupon diskon tidak tersedia untuk subscription on-demand
-
DISCOUNT_NOT_AVAILABLE_FOR_PRODUCT- Pemicu: Kode diterapkan pada produk yang tidak dicakupnya
- Pesan: Kupon diskon tidak tersedia untuk produk ini
-
INVALID_DISCOUNT_CODE- Pemicu: Kode tidak ada, atau tidak berlaku untuk produk mana pun dalam cart
- Pesan: Discount Code tidak valid (atau) Discount Code tidak dapat diterapkan pada produk mana pun dalam cart
-
INVALID_PERCENTAGE- Pemicu: Persentase lebih tinggi dari 100% (10.000 basis poin)
- Pesan: Jumlah persentase tidak boleh lebih dari 10000 (atau) Jumlah kode diskon tidak boleh lebih dari 100%
-
UNSUPPORTED_DISCOUNT_TYPE- Pemicu: Jenis diskon yang tidak didukung.
percentagedanflatkeduanya didukung; diskon jumlah per unit tidak didukung. - Pesan: Hanya kode diskon persentase dan flat yang didukung (atau) Untuk saat ini, hanya kode diskon persentase yang didukung
- Pemicu: Jenis diskon yang tidak didukung.
License Key
-
ACTIVATION_LIMIT_LESS_THAN_CURRENT_AMOUNT- Pemicu: Batas aktivasi baru license key lebih rendah daripada jumlah instance saat ini
- Pesan: Batas aktivasi baru tidak boleh kurang dari jumlah instance saat ini
-
INACTIVE_LICENSE_KEY- Pemicu: Status license key bukan
active - Pesan: License key tidak aktif
- Pemicu: Status license key bukan
-
LICENSE_KEY_LIMIT_REACHED- Pemicu: Jumlah aktivasi telah mencapai batas aktivasi
- Pesan: Batas aktivasi license key tercapai
-
LICENSE_KEY_NOT_FOUND- Pemicu: ID instance atau ID license key tidak valid
- Pesan: Instance license key tidak ditemukan atau bukan milik license key ini
-
NO_EXPIRY_ON_SUBSCRIPTION_LICENSE_KEYS- Pemicu: Upaya menetapkan tanggal kedaluwarsa pada license key berbasis subscription
- Pesan: Tidak dapat menetapkan tanggal kedaluwarsa untuk license key berbasis subscription
Billing & Meter Berbasis Penggunaan
-
DUPLICATE_METER_IDS_IN_REQUEST- Pemicu: ID meter yang sama muncul lebih dari sekali dalam permintaan
- Pesan: Meter Id duplikat tidak diizinkan
-
INVALID_QUANTITY- Pemicu: Quantity selain 1 untuk produk dengan pricing berbasis penggunaan
- Pesan: Hanya quantity 1 yang diizinkan pada produk dengan harga berbasis penggunaan
-
METER_IS_DELETED- Pemicu: Upaya menggunakan meter yang telah dihapus
- Pesan: Meter sudah dihapus
-
MISSING_METER_IDS- Pemicu: Daftar ID meter kosong atau berisi ID yang tidak valid
- Pesan: Satu atau beberapa ID meter tidak ada:
{id}
Billing Berbasis Kredit
-
CREDIT_ENTITLEMENT_IS_DELETED- Pemicu: Mengoperasikan entitlement kredit yang telah dihapus
- Pesan: Entitlement kredit sudah dihapus
-
CREDIT_ENTITLEMENT_NAME_ALREADY_EXISTS- Pemicu: Membuat entitlement kredit dengan nama yang sudah ada
- Pesan: Entitlement kredit dengan nama ini sudah ada
-
OVERAGE_LIMIT_EXCEEDED- Pemicu: Penggunaan atau pengurangan kredit akan melebihi batas overage yang dikonfigurasi
- Pesan: Batas overage terlampaui
Wallet
-
INSUFFICIENT_WALLET_FUNDS- Pemicu: Saldo wallet lebih rendah daripada jumlah debit
- Pesan: Dana di wallet tidak mencukupi
-
NEGATIVE_BALANCE_ADJUSTMENT- Pemicu: Upaya membuat saldo wallet menjadi negatif
- Pesan: Saldo wallet tidak boleh dibuat negatif
Currency, Pajak & Wilayah
-
EXCHANGE_RATE_NOT_FOUND- Pemicu: Tidak ada nilai tukar untuk pasangan currency tersebut
- Pesan: Nilai tukar tidak ditemukan untuk mengonversi dari
{currency}ke{currency}
-
INVALID_TAX_ID- Pemicu: VAT, GST, atau TIN gagal divalidasi
- Pesan: Tax Id tidak valid
-
REQUEST_AMOUNT_BELOW_MINIMUM- Pemicu: Jumlah lebih rendah daripada minimum yang ditetapkan untuk produk
- Pesan: Jumlah tidak boleh kurang dari jumlah minimum yang ditentukan untuk produk
-
TOTAL_PAYMENT_AMOUNT_BELOW_MINIMUM_AMOUNT- Pemicu: Total cart gabungan, termasuk pajak, lebih rendah daripada jumlah minimum yang diperlukan untuk memproses pembayaran. Minimum tersebut bergantung pada currency billing dan apakah pembayaran dilakukan satu kali atau berupa subscription. Untuk currency selain USD, EUR, dan GBP, total juga diperiksa terhadap minimum USD. Lihat Jumlah Minimum
- Pesan: Jumlah minimum
{display_str}diperlukan untuk memproses pembayaran, misalnyaMinimum amount of 1.00 USD is required to process payment
-
UNSUPPORTED_BILLING_CURRENCY- Pemicu: Currency billing yang diminta tidak didukung untuk subscription ini
- Pesan: Currency billing selain USD tidak didukung untuk subscription
-
UNSUPPORTED_COUNTRY- Pemicu: Negara tidak didukung
- Pesan: Negara
{country_name}saat ini tidak didukung
-
UNSUPPORTED_CURRENCY- Pemicu: Currency produk atau add-on bukan currency yang dapat digunakan untuk penagihan oleh Dodo Payments. Harga dasar dapat ditetapkan dalam currency apa pun yang dapat digunakan untuk penagihan, sehingga error ini biasanya berarti kode currency tidak valid atau tidak didukung.
- Pesan: Currency saat ini tidak didukung (atau) Saat ini hanya produk USD dan INR yang didukung (atau) Saat ini hanya USD dan INR yang didukung untuk harga addon (atau) Hanya dapat meminta USD atau INR untuk billing_currency (atau) Currency Tidak Didukung (atau) Currency tidak terduga untuk subscription kartu India
-
UNSUPPORTED_TAX_CATEGORY- Pemicu: Kategori pajak bukan salah satu nilai yang didukung
- Pesan: Kategori
{category}saat ini tidak didukung
Validasi & Permintaan
-
DUPLICATE_LINE_ITEMS_IN_REQUEST- Pemicu:
item_idyang sama muncul lebih dari sekali dalamitems[] - Pesan: item_ids duplikat ditentukan dalam array items
- Pemicu:
-
INVALID_QUERY_PARAMS- Pemicu: Parameter query yang saling eksklusif atau memiliki format yang salah
- Pesan: Query params hanya boleh berisi time_frame atau (start, end) (atau) Awal rentang tidak boleh setelah akhir rentang
-
INVALID_REQUEST_BODY- Pemicu: JSON memiliki format yang salah atau melanggar schema
- Pesan: Request body Anda tidak valid. Periksa request headers dan object Anda.
-
INVALID_REQUEST_PARAMETERS- Pemicu: Nilai parameter valid secara format tetapi tidak valid secara makna, misalnya tanggal di masa lalu
- Pesan: Tidak dapat mengubah next_billing_date ke waktu yang telah berlalu (atau) Checkout dengan lebih dari satu produk subscription tidak dapat memuat produk satu kali (atau) Semua ID produk harus unik (atau) Subscription on-demand tidak dapat memuat lebih dari satu produk (atau) Checkout dapat memuat maksimal 20 produk subscription (atau) Produk subscription duplikat dalam satu checkout tidak diizinkan
-
MAXIMUM_KEYS_REACHED- Pemicu: Metadata atau custom fields melebihi 50 pasangan key-value
- Pesan: Melebihi 50 pasangan key-value
Umum & Sistem
-
INTEGER_CONVERSION_FAILURE- Pemicu: Konversi sisi server antara integer dan string atau decimal gagal, misalnya saat total cart terlalu besar untuk diproses
- Pesan: Kegagalan Konversi Integer (atau) Total cart terlalu besar untuk diproses. Kurangi quantity, atau pilih currency billing lain.
-
INTERNAL_SERVER_ERROR- Pemicu: Error server yang tidak terduga. Catat detail request di sisi Anda.
- Pesan: Tidak ada pesan publik (generic 500,
messagebiasanyanull)
-
NOT_FOUND- Pemicu: 404 umum untuk resource yang tidak ditemukan
- Pesan: Item tidak ditemukan (atau pesan yang lebih spesifik yang menyebutkan item yang hilang)
-
TOO_MANY_REQUESTS- Pemicu: Batas rate terlampaui (HTTP 429)
- Pesan: Tidak ada pesan
-
UNSUPPORTED_ACTION- Pemicu: Tindakan yang tidak didukung oleh jenis resource
- Pesan: Mengubah paket untuk subscription berbasis penggunaan tidak didukung
Praktik Terbaik
Ikuti praktik berikut saat menangani error API:- Tangani setiap respons error dalam aplikasi Anda, dan buat percabangan berdasarkan
code, bukan berdasarkanmessage. - Catat HTTP status,
code, danmessagedari setiap request yang gagal. - Tampilkan kepada end user pesan yang ditulis untuk mereka, bukan
messageAPI mentah. - Coba kembali hanya error transien, seperti respons
429dan5xxatauDISCOUNT_CONCURRENT_REDEMPTION, setelah jeda. - Hubungi support untuk error yang tidak dapat Anda selesaikan.