> ## Documentation Index
> Fetch the complete documentation index at: https://docs.dodopayments.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Kode Kesalahan

> Referensi untuk kode kesalahan API dan logika bisnis Dodo Payments, dikelompokkan berdasarkan kategori, dengan pemicu, pesan, dan cara menyelesaikannya.

## Ikhtisar

Dodo Payments API menggunakan kode status HTTP standar dan kode kesalahan kustom untuk menunjukkan keberhasilan atau kegagalan permintaan API. Ketika terjadi kesalahan, API mengembalikan kode status HTTP yang sesuai dan respons JSON yang berisi informasi rinci tentang kesalahan tersebut.

Setiap respons kesalahan mencakup:

* Kode status HTTP yang menunjukkan kategori umum dari kesalahan
* Kode kesalahan spesifik yang mengidentifikasi sifat tepat dari kesalahan
* Pesan kesalahan yang dapat dibaca manusia yang menjelaskan apa yang salah
* Rincian tambahan tentang kesalahan jika berlaku

Memahami kode kesalahan ini dan artinya sangat penting untuk:

* Memecahkan masalah integrasi
* Menerapkan penanganan kesalahan yang tepat dalam aplikasi Anda
* Memberikan umpan balik yang berarti kepada pengguna akhir
* Mempertahankan sistem pemrosesan pembayaran yang kuat

<Note>
  Ini adalah kesalahan **API dan logika bisnis**. Untuk **alasan penolakan kartu** yang dikembalikan pada pembayaran yang gagal (seperti `INSUFFICIENT_FUNDS` atau `CARD_DECLINED`), lihat referensi [Kegagalan Transaksi](/api-reference/transaction-failures) sebagai gantinya.
</Note>

## Kode Kesalahan API Standar

| HTTP Status | Nama                  | Deskripsi                                                              |
| ----------- | --------------------- | ---------------------------------------------------------------------- |
| **400**     | Bad Request           | Permintaan salah bentuk atau mengandung parameter tidak valid          |
| **401**     | Unauthorized          | Autentikasi gagal atau kunci API tidak valid                           |
| **403**     | Forbidden             | Kunci API tidak memiliki izin untuk mengakses sumber daya yang diminta |
| **404**     | Not Found             | Sumber daya yang diminta tidak ada                                     |
| **405**     | Method Not Allowed    | Metode HTTP tidak didukung untuk endpoint ini                          |
| **409**     | Conflict              | Permintaan bertentangan dengan status sumber daya saat ini             |
| **422**     | Unprocessable Entity  | Permintaan tepat bentuk tetapi mengandung kesalahan semantik           |
| **429**     | Too Many Requests     | Batas laju terlampaui                                                  |
| **500**     | Internal Server Error | Terjadi kesalahan yang tidak terduga di server kami                    |
| **502**     | Bad Gateway           | Server menerima respons tidak valid dari server hulu                   |
| **503**     | Service Unavailable   | Layanan sementara tidak tersedia                                       |
| **504**     | Gateway Timeout       | Server kehabisan waktu menunggu respons hulu                           |

## Format Respons Kesalahan

Ketika terjadi kesalahan, API mengembalikan respons JSON dengan struktur berikut:

```json theme={null}
{
  "code": "UNSUPPORTED_COUNTRY",
  "message": "Country AI currently not supported"
}
```

## Referensi Kode Kesalahan

Kode kesalahan di bawah ini dikelompokkan berdasarkan area API yang mereka kaitkan. Setiap entri mencantumkan kondisi yang memicu dan pesan yang dikembalikan API.

### Autentikasi & Akun

* `UNAUTHORIZED`
  * **Pemicu:** Tidak ada kunci API atau token/scope tidak valid
  * **Pesan:** Anda tidak diizinkan untuk melakukan tindakan ini

* `MERCHANT_NOT_LIVE`
  * **Pemicu:** Bisnis masih dalam mode tes/sandbox
  * **Pesan:** Merchant belum aktif

### Pembayaran & Checkout

* `CHECKOUT_SESSION_CONSUMED`
  * **Pemicu:** Sesi checkout telah menghasilkan pembayaran
  * **Pesan:** Sesi checkout telah digunakan

* `NO_ELIGIBLE_PAYMENT_METHODS`
  * **Pemicu:** Setelah memfilter, tidak ada yang tersisa
  * **Pesan:** Tidak ada metode pembayaran yang memenuhi syarat ditemukan

* `PAYMENT_NOT_SUCCEEDED`
  * **Pemicu:** Upaya untuk mengembalikan/proses pembayaran tidak berhasil
  * **Pesan:** Pembayaran yang diberikan tidak berhasil

* `PREVIOUS_PAYMENT_PENDING`
  * **Pemicu:** Upaya untuk membuat tagihan sementara yang sebelumnya dalam keadaan non-terminal
  * **Pesan:** Tidak dapat membuat tagihan baru karena pembayaran sebelumnya belum berhasil

* `UNSUCCESSFUL_PAYMENT_ID`
  * **Pemicu:** ID Pembayaran mengacu pada pembayaran yang tidak berhasil
  * **Pesan:** ID Pembayaran memiliki status tidak berhasil.

### Konektor & BYOP

Kesalahan ini berkaitan dengan konektor pembayaran yang dimiliki merchant (Bawa Pemrosesor Anda Sendiri).

* `BYOP_CONNECTOR_DISABLED`
  * **Pemicu:** Memperbarui metode pembayaran pada langganan yang dialihkan melalui konektor BYOP yang dinonaktifkan
  * **Pesan:** Langganan dialihkan melalui konektor BYOP milik merchant yang saat ini dinonaktifkan

* `BYOP_CUSTOM_INVOICE_ADDRESS_MISSING`
  * **Pemicu:** Pembayaran BYOP merchant kehilangan alamat faktur khusus yang dibutuhkan
  * **Pesan:** Alamat faktur khusus BYOP diperlukan ketika pembayaran dialihkan melalui konektor merchant

* `CONNECTOR_LABEL_ALREADY_EXISTS`
  * **Pemicu:** Membuat konektor dengan label yang sudah ada
  * **Pesan:** Konektor dengan label ini sudah ada. Silakan pilih label lain.

### Pengembalian Uang

* `EXISTING_REFUND_REQUEST_PROCESSING`
  * **Trigger:** Permintaan pengembalian dana sebelumnya masih diproses
  * **Message:** Permintaan pengembalian dana dengan status "Pending" masih diproses

* `LINE_ITEM_FULLY_REFUNDED`
  * **Pemicu:** Upaya untuk mengembalikan item yang telah dikembalikan sepenuhnya
  * **Pesan:** Item {id} telah dikembalikan sepenuhnya tidak dapat dikembalikan lebih lanjut.

* `LINE_ITEM_NOT_FOUND`
  * **Pemicu:** ID Item bukan bagian dari pembayaran yang dirujuk
  * **Pesan:** Item {id} tidak ditemukan dalam pembayaran

* `LINE_ITEM_PRORATED`
  * **Pemicu:** Pengembalian atau pembaruan dicoba pada baris didiskon
  * **Pesan:** Item {id} tidak dapat dikembalikan karena diprorata

* `LINE_ITEM_REFUND_AMOUNT_TOO_HIGH`
  * **Pemicu:** Jumlah pengembalian > jumlah dibayar (pajak termasuk)
  * **Pesan:** Item {id} diminta jumlah pengembalian termasuk pajak adalah {amount} yang melebihi jumlah dibayar {amount}

* `LINE_ITEM_REFUND_AMOUNT_TOO_LOW`
  * **Pemicu:** Jumlah pengembalian di bawah ambang batas minimum
  * **Pesan:** Item {id} diminta jumlah pengembalian adalah {amount} yang terlalu rendah

* `NOTHING_TO_REFUND`
  * **Pemicu:** Tidak ada jumlah yang dapat dikembalikan tersisa; semua item positif telah dikembalikan sepenuhnya
  * **Pesan:** Tidak ada jumlah yang dapat dikembalikan tersisa. Semua item positif telah dikembalikan sepenuhnya.

* `PARTIAL_REFUND_NOT_ALLOWED`
  * **Pemicu:** Pengembalian parsial dicoba pada metode pembayaran yang hanya mendukung pengembalian penuh
  * **Pesan:** Pengembalian parsial tidak diperbolehkan untuk metode pembayaran ini

* `PAYMENT_ALREADY_REFUNDED`
  * **Pemicu:** Duplikasi pengembalian
  * **Pesan:** Pembayaran ini sudah dikembalikan

* `PAYMENT_HAS_BEEN_REFUNDED`
  * **Pemicu:** Pembayaran telah dikembalikan sepenuhnya
  * **Pesan:** ID Pembayaran telah dikembalikan sepenuhnya.

* `REFUND_AMOUNT_EXCEEDS_PAID_AMOUNT`
  * **Pemicu:** Jumlah pengembalian agregat > jumlah dibayar
  * **Pesan:** Jumlah pengembalian yang dihitung lebih besar dari jumlah dibayar

* `REFUND_WINDOW_EXPIRED`
  * **Pemicu:** Di luar jendela pengembalian yang diperbolehkan
  * **Pesan:** Pengembalian tidak dapat dilakukan {days} hari setelah pembuatan pembayaran. Hubungi [support@dodopayments.com](mailto:support@dodopayments.com).

* `ZERO_AMOUNT_PAYMENT_REFUND_NOT_ALLOWED`
  * **Pemicu:** Upaya untuk mengembalikan pembayaran dengan jumlah nol
  * **Pesan:** Tidak dapat mengembalikan pembayaran dengan jumlah mata uang nol

### Langganan & Tambahan

* `ADDONS_IN_USAGE_BASED_BILLING_NOT_SUPPORTED`
  * **Pemicu:** Upaya untuk menambahkan addon pada langganan penagihan berbasis penggunaan
  * **Pesan:** Addon pada Langganan tidak didukung untuk Penagihan Berbasis Penggunaan

* `ADDONS_NOT_ALLOWED_FOR_ON_DEMAND`
  * **Pemicu:** Upaya untuk menambahkan addon pada langganan sesuai permintaan
  * **Pesan:** Addon tidak diperbolehkan untuk langganan sesuai permintaan

* `CANCEL_SCHEDULED_PLAN_CHANGE_FOR_CUSTOMER_PORTAL_DISABLED`
  * **Pemicu:** Portal Pelanggan berupaya membatalkan perubahan rencana yang dijadwalkan sementara bisnis telah menonaktifkan tindakan tersebut
  * **Pesan:** Pembatalan perubahan rencana yang dijadwalkan dinonaktifkan untuk portal pelanggan.

* `CHARGE_NOT_ALLOWED_FOR_SCHEDULED_CANCELLATION`
  * **Pemicu:** Upaya untuk menagih langganan yang dijadwalkan untuk pembatalan
  * **Pesan:** Langganan dijadwalkan untuk pembatalan

* `CUSTOMER_HAS_EXISTING_SUBSCRIPTION`
  * **Pemicu:** Membuat langganan untuk pelanggan yang sudah memiliki satu, ketika beberapa langganan per pelanggan tidak diperbolehkan
  * **Pesan:** Pelanggan {id} sudah memiliki langganan. Untuk mengizinkan beberapa langganan per pelanggan, ubah pengaturan bisnis

* `DO_NOT_BILL_NOT_ALLOWED_IN_CUSTOMER_PORTAL`
  * **Pemicu:** `do_not_bill` mode prorasi digunakan dalam perubahan rencana Portal Pelanggan
  * **Pesan:** do\_not\_bill mode prorasi tidak diperbolehkan di portal pelanggan

* `DUPLICATE_ADDON_IDS_IN_REQUEST`
  * **Pemicu:** `addon_id` yang sama muncul lebih dari sekali dalam permintaan
  * **Pesan:** ID addon ganda tidak diperbolehkan

* `INACTIVE_SUBSCRIPTION_PLAN_CHANGE_NOT_SUPPORTED`
  * **Pemicu:** Perubahan rencana pada langganan tidak aktif
  * **Pesan:** Mengganti rencana tidak didukung untuk langganan tidak aktif

* `INVALID_PRORATION_MODE_WITH_NEXT_BILLING_DATE`
  * **Pemicu:** Mode prorasi selain `full_immediately` digunakan dengan `effective_at: next_billing_date`
  * **Pesan:** Hanya mode prorasi full\_immediately yang diperbolehkan dengan effective\_at: next\_billing\_date

* `MISSING_ADDON_IDS`
  * **Pemicu:** Daftar `addon_id` kosong atau ID tidak dikenal
  * **Pesan:** Satu atau lebih ID produk tidak ada: {id}

* `ON_DEMAND_PLAN_CHANGE_NOT_SUPPORTED`
  * **Pemicu:** Tukar rencana tidak diperbolehkan sesuai permintaan
  * **Pesan:** Mengganti rencana tidak didukung untuk langganan sesuai permintaan

* `ON_DEMAND_USAGE_BASED_BILLING_NOT_SUPPORTED`
  * **Pemicu:** Upaya untuk menggunakan sesuai permintaan dengan penagihan berbasis penggunaan
  * **Pesan:** Langganan Sesuai Permintaan tidak didukung untuk Penagihan Berbasis Penggunaan

* `ONE_TIME_PRODUCTS_NOT_ALLOWED_FOR_ON_DEMAND`
  * **Pemicu:** Produk satu kali ditambahkan ke langganan sesuai permintaan
  * **Pesan:** Produk satu kali tidak diperbolehkan untuk langganan sesuai permintaan

* `PENDING_PLAN_CHANGE_EXISTS`
  * **Pemicu:** Permintaan perubahan rencana baru sementara yang sebelumnya masih menunggu pembayaran
  * **Pesan:** Perubahan rencana tertunda sudah ada untuk langganan ini. Silakan menunggu pembayaran saat ini selesai.

* `PLAN_CHANGE_FOR_CUSTOMER_PORTAL_DISABLED`
  * **Pemicu:** Perubahan rencana melalui Portal Pelanggan sementara bisnis telah menonaktifkannya
  * **Pesan:** Perubahan rencana langganan untuk portal pelanggan dinonaktifkan.

* `PLAN_CHANGE_NOT_ALLOWED_FOR_SCHEDULED_CANCELLATION`
  * **Pemicu:** Perubahan rencana dicoba pada langganan yang dijadwalkan untuk pembatalan
  * **Pesan:** Langganan dijadwalkan untuk pembatalan

* `SCHEDULE_PLAN_CHANGE_FOR_CUSTOMER_PORTAL_DISABLED`
  * **Pemicu:** Menjadwalkan perubahan rencana melalui Portal Pelanggan sementara bisnis telah menonaktifkannya
  * **Pesan:** Menjadwalkan perubahan rencana dinonaktifkan untuk bisnis ini.

* `SCHEDULED_PLAN_CHANGE_EXISTS`
  * **Pemicu:** Membuat perubahan rencana yang dijadwalkan ketika yang satu sudah ada
  * **Pesan:** Perubahan rencana yang dijadwalkan sudah ada untuk langganan ini. Silakan batalkan perubahan terjadwal yang ada sebelum membuat yang baru.

* `SCHEDULED_PLAN_CHANGE_NOT_FOUND`
  * **Pemicu:** Mengacu atau membatalkan perubahan rencana yang dijadwalkan yang tidak ada
  * **Pesan:** Tidak ditemukan perubahan rencana yang dijadwalkan untuk langganan ini.

* `SUBSCRIPTION_EXPIRED`
  * **Pemicu:** Penagihan melebihi `ends_at`
  * **Pesan:** Langganan kedaluwarsa tidak dapat membuat tagihan baru

* `SUBSCRIPTION_INACTIVE`
  * **Pemicu:** Status ≠ `ACTIVE`
  * **Pesan:** Langganan tidak aktif

* `SUBSCRIPTION_NOT_ON_DEMAND`
  * **Pemicu:** Diharapkan sesuai permintaan tetapi mendapatkan interval tetap
  * **Pesan:** Langganan sudah tidak sesuai permintaan

* `SUBSCRIPTION_PAYMENT_RETRY_LIMIT_EXCEEDED`
  * **Pemicu:** Pembayaran langganan mengalami kegagalan ulang melebihi batas maksimum percobaan
  * **Pesan:** Batas percobaan ulang maksimum dari 10 percobaan pada langganan ini telah terlampaui

### Produk, Keranjang & Merek

* `BRAND_MISMATCH`
  * **Pemicu:** Item keranjang berasal dari merek yang berbeda
  * **Pesan:** Semua item dalam keranjang produk harus berasal dari merek yang sama

* `BRAND_NOT_ENABLED`
  * **Pemicu:** Merek dinonaktifkan atau tidak aktif
  * **Pesan:** Merek yang diberikan tidak diaktifkan

* `BRAND_SUBMISSION_NOT_ENABLED`
  * **Pemicu:** Fitur pengajuan verifikasi merek tidak diaktifkan
  * **Pesan:** Pengajuan ulang verifikasi merek tidak diaktifkan

* `FILE_IN_USE`
  * **Pemicu:** Menghapus file produk digital yang masih direferensikan oleh pemberian hak aktif (lewati `?force=true` untuk override)
  * **Pesan:** File digital masih direferensikan oleh pemberian hak aktif

* `INVALID_SUGGESTED_PRICE`
  * **Pemicu:** Harga PWYW \< harga minimum yang diperbolehkan
  * **Pesan:** Harga yang disarankan tidak dapat lebih rendah dari harga minimum. Dalam kasus bayar sesuka hati, harga dianggap sebagai jumlah minimum yang diterima

* `LOCALIZED_PRICE_ALREADY_EXISTS`
  * **Pemicu:** Harga lokal untuk produk dan negara/mata uang ini sudah ada
  * **Pesan:** Harga lokal untuk produk dan negara/mata uang ini sudah ada

* `LOCALIZED_PRICE_DUPLICATES_BASE`
  * **Pemicu:** Harga lokal menduplikasi mata uang/negara dasar produk
  * **Pesan:** Harga lokal menduplikasi mata uang/negara dasar produk

* `LOCALIZED_PRICE_SHAPE_MISMATCH`
  * **Pemicu:** Bentuk harga lokal tidak cocok dengan `pricing_mode` produk
  * **Pesan:** Bentuk harga lokal tidak cocok dengan pricing\_mode produk

* `MISSING_PRODUCT_INFORMATION`
  * **Pemicu:** Produk ada tetapi informasi wajib hilang
  * **Pesan:** Produk {id} ada tetapi informasi wajib lainnya hilang atau salah

* `PAY_AS_YOU_WANT_AMOUNT_REQUIRED`
  * **Pemicu:** Harga hilang untuk produk PWYW
  * **Pesan:** Jumlah wajib untuk produk bayar sesuka hati

* `PRODUCT_CART_EMTPY`
  * **Pemicu:** Keranjang produk yang kosong dikirimkan
  * **Pesan:** product\_cart kosong (kode kesalahan ini sengaja dieja `EMTPY` untuk mencocokkan nilai persis yang dikembalikan API)

* `PRODUCT_COLLECTION_IS_DELETED`
  * **Pemicu:** Mengoperasikan kumpulan produk yang dihapus
  * **Pesan:** *Tidak ada pesan*

* `PRODUCT_COLLECTION_MUST_HAVE_PRODUCTS`
  * **Pemicu:** Menghapus produk terakhir (atau group terakhir dengan produk) dari sebuah kumpulan
  * **Pesan:** Tidak dapat menghapus produk terakhir dalam kumpulan. Arsipkan kumpulan sebagai gantinya.

* `PRODUCT_IS_DELETED`
  * **Pemicu:** Produk dihapus secara lembut
  * **Pesan:** *Tidak ada pesan*

* `PRODUCT_PRICING_MODE_REQUIRED`
  * **Pemicu:** Menambahkan harga lokal sebelum `pricing_mode` produk disetel
  * **Pesan:** Product pricing\_mode harus disetel sebelum menambahkan harga lokal

* `SLUG_ALREADY_TAKEN`
  * **Pemicu:** Slug produk yang diminta / URL pendek sudah digunakan
  * **Pesan:** Slug sudah digunakan

* `UNABLE_TO_EDIT_PRIMARY_BRAND`
  * **Pemicu:** Upaya untuk memperbarui merek utama melalui API biasa
  * **Pesan:** Merek utama tidak dapat diperbarui melalui endpoint API ini.

### Diskon

* `DISCOUNT_ALREADY_USED_ON_SUBSCRIPTION`
  * **Pemicu:** Menggunakan kembali diskon yang sudah digunakan pada langganan ini
  * **Pesan:** Diskon ini sudah digunakan pada langganan ini

* `DISCOUNT_CODE_ALREADY_EXISTS`
  * **Pemicu:** Pembuatan kode diskon duplikat
  * **Pesan:** Kode Diskon sudah ada

* `DISCOUNT_CODE_EXPIRED`
  * **Pemicu:** Kode diskon melampaui `expires_at` tanggal
  * **Pesan:** Kode diskon kedaluwarsa

* `DISCOUNT_CODE_USAGE_LIMIT_EXCEEDED`
  * **Pemicu:** Diskon digunakan kembali setelah `usage_limit` tercapai
  * **Pesan:** Batas penggunaan tidak dapat kurang dari kali\_digunakan / Batas penggunaan kode diskon tercapai

* `DISCOUNT_NOT_APPLICABLE_TO_NEW_PRODUCT`
  * **Pemicu:** Perubahan rencana ke produk yang tidak diterapkan diskon yang ada
  * **Pesan:** Diskon tidak berlaku pada produk rencana baru

* `DISCOUNT_NOT_AVAILABLE_FOR_ON_DEMAND`
  * **Pemicu:** Kode diterapkan pada langganan sesuai permintaan
  * **Pesan:** Kupon diskon tidak tersedia untuk langganan sesuai permintaan

* `DISCOUNT_NOT_AVAILABLE_FOR_PRODUCT`
  * **Pemicu:** Kode diterapkan pada produk yang tidak terkait
  * **Pesan:** Kupon diskon tidak tersedia untuk produk ini

* `INVALID_DISCOUNT_CODE`
  * **Pemicu:** Kode tidak ada / tidak berlaku
  * **Pesan:** Kode Diskon tidak valid / Kode Diskon tidak dapat diterapkan pada produk apa pun dalam keranjang

* `INVALID_PERCENTAGE`
  * **Pemicu:** Persentase jumlah > 100% (atau 10.000 basis poin)
  * **Pesan:** Persentase jumlah tidak dapat lebih dari 10000 / Jumlah kode diskon tidak dapat lebih dari 100%

* `UNSUPPORTED_DISCOUNT_TYPE`
  * **Pemicu:** Diskon jumlah tetap, dll., belum aktif
  * **Pesan:** Hanya kode diskon persentase yang didukung untuk saat ini

### Kunci Lisensi

* `ACTIVATION_LIMIT_LESS_THAN_CURRENT_AMOUNT`
  * **Pemicu:** Aktivasi kunci lisensi: batas baru \< jumlah instansi yang ada
  * **Pesan:** Batas aktivasi baru tidak dapat kurang dari jumlah instansi saat ini

* `INACTIVE_LICENSE_KEY`
  * **Pemicu:** Status kunci ≠ `ACTIVE`
  * **Pesan:** Kunci lisensi tidak aktif

* `LICENSE_KEY_LIMIT_REACHED`
  * **Pemicu:** Aktivasi = batas
  * **Pesan:** Batas aktivasi kunci lisensi tercapai

* `LICENSE_KEY_NOT_FOUND`
  * **Pemicu:** ID instansi atau ID kunci tidak valid
  * **Pesan:** Instansi kunci lisensi tidak ditemukan atau bukan milik kunci lisensi ini

* `NO_EXPIRY_ON_SUBSCRIPTION_LICENSE_KEYS`
  * **Pemicu:** Upaya untuk mengatur kadaluarsa pada kunci berbasis langganan
  * **Pesan:** Tidak dapat mengatur tanggal kadaluarsa untuk kunci lisensi berbasis langganan

### Penagihan Berbasis Penggunaan & Meter

* `DUPLICATE_METER_IDS_IN_REQUEST`
  * **Pemicu:** ID meter yang sama muncul beberapa kali dalam permintaan
  * **Pesan:** ID Meter duplikat tidak diperbolehkan

* `INVALID_QUANTITY`
  * **Pemicu:** Kuantitas tidak valid ditentukan untuk penetapan harga berbasis penggunaan
  * **Pesan:** Hanya 1 kuantitas yang diizinkan untuk produk harga berbasis penggunaan

* `METER_IS_DELETED`
  * **Pemicu:** Upaya untuk menggunakan meter yang dihapus
  * **Pesan:** Meteran sudah dihapus

* `MISSING_METER_IDS`
  * **Pemicu:** Daftar ID meter kosong atau berisi ID tidak valid
  * **Pesan:** Satu atau lebih ID meter tidak ada: {id}

### Penagihan Berbasis Kredit

* `CREDIT_ENTITLEMENT_IS_DELETED`
  * **Pemicu:** Mengoperasikan hak kredit yang telah dihapus
  * **Pesan:** Hak kredit sudah dihapus

* `CREDIT_ENTITLEMENT_NAME_ALREADY_EXISTS`
  * **Pemicu:** Membuat hak kredit dengan nama yang sudah ada
  * **Pesan:** Hak kredit dengan nama ini sudah ada

* `OVERAGE_LIMIT_EXCEEDED`
  * **Pemicu:** Penggunaan atau pengurangan kredit akan melebihi batas overage yang dikonfigurasi
  * **Pesan:** Batas overage terlampaui

### Dompet

* `INSUFFICIENT_WALLET_FUNDS`
  * **Pemicu:** Saldo dompet \< jumlah debit
  * **Pesan:** Dana di dompet tidak mencukupi

* `NEGATIVE_BALANCE_ADJUSTMENT`
  * **Pemicu:** Upaya untuk membuat saldo dompet negatif
  * **Pesan:** Saldo dompet tidak boleh negatif

### Mata Uang, Pajak & Wilayah

* `EXCHANGE_RATE_NOT_FOUND`
  * **Pemicu:** Tidak ada kurs tukar untuk pasangan mata uang `from → to`
  * **Pesan:** Kurs tukar tidak ditemukan untuk konversi dari Mata Uang ke Mata Uang

* `INVALID_TAX_ID`
  * **Pemicu:** Validasi VAT/GST/TIN gagal
  * **Pesan:** Tax Id tidak valid

* `REQUEST_AMOUNT_BELOW_MINIMUM`
  * **Pemicu:** Jumlah \< minimum produk
  * **Pesan:** Jumlah tidak boleh kurang dari jumlah minimum yang ditentukan untuk produk

* `TOTAL_PAYMENT_AMOUNT_BELOW_MINIMUM_AMOUNT`
  * **Pemicu:** Total kombinasi keranjang \< minimum gateway
  * **Pesan:** Jumlah minimum {display_str} dibutuhkan untuk memproses pembayaran

* `UNSUPPORTED_BILLING_CURRENCY`
  * **Pemicu:** Langganan dibatasi untuk USD
  * **Pesan:** Mata uang penagihan non USD tidak didukung untuk langganan

* `UNSUPPORTED_COUNTRY`
  * **Pemicu:** Geo belum didukung
  * **Pesan:** Negara {country_name} saat ini tidak didukung

* `UNSUPPORTED_CURRENCY`
  * **Pemicu:** Mata uang produk atau addon tidak valid
  * **Pesan:** Mata uang saat ini tidak didukung / Hanya produk USD dan INR yang didukung saat ini / Hanya USD dan INR yang didukung untuk harga addon / Hanya dapat meminta USD atau INR untuk mata uang penagihan / Mata Uang Tidak Didukung / Mata uang tak terduga untuk langganan kartu India

* `UNSUPPORTED_TAX_CATEGORY`
  * **Pemicu:** String kategori pajak tidak ada dalam enum
  * **Pesan:** Kategori {category} saat ini tidak didukung

### Validasi & Permintaan

* `DUPLICATE_LINE_ITEMS_IN_REQUEST`
  * **Pemicu:** `item_id` yang sama muncul dua kali dalam `items[]`
  * **Pesan:** item\_ids duplikat ditentukan dalam array item

* `INVALID_QUERY_PARAMS`
  * **Pemicu:** Parameter kueri saling eksklusif / salah bentuk
  * **Pesan:** Parameter kueri harus hanya mengandung waktu\_kerangka atau (awal, akhir)

* `INVALID_REQUEST_BODY`
  * **Pemicu:** JSON salah bentuk atau pelanggaran skema
  * **Pesan:** Body permintaan Anda tidak valid. Harap periksa header dan objek permintaan Anda.

* `INVALID_REQUEST_PARAMETERS`
  * **Pemicu:** Semantik salah (misalnya, tanggal di masa lalu)
  * **Pesan:** Tidak dapat mengubah next\_billing\_date ke waktu masa lalu

* `MAXIMUM_KEYS_REACHED`
  * **Pemicu:** Metadata / custom-fields melebihi 50 pasang
  * **Pesan:** Melebihi 50 pasangan kunci-nilai

### Umum & Sistem

* `INTEGER_CONVERSION_FAILURE`
  * **Pemicu:** Konversi bilangan bulat ↔ string/desimal yang gagal di sisi server
  * **Pesan:** Kegagalan Konversi Bilangan Bulat

* `INTERNAL_SERVER_ERROR`
  * **Pemicu:** Pengecualian tidak tertangkap; Anda harus mencatat detailnya di sisi server
  * **Pesan:** *Tidak ada pesan umum (500 generic)*

* `NOT_FOUND`
  * **Pemicu:** 404 umum untuk sumber yang hilang
  * **Pesan:** Item tidak ditemukan *(atau lebih spesifik)*

* `TOO_MANY_REQUESTS`
  * **Pemicu:** 429 batas laju
  * **Pesan:** *Tidak ada pesan*

* `UNSUPPORTED_ACTION`
  * **Pemicu:** Tindakan tidak didukung untuk jenis sumber daya
  * **Pesan:** Mengubah rencana untuk langganan berbasis penggunaan tidak didukung

## Praktik Terbaik

1. Selalu tangani kesalahan dengan baik dalam aplikasi Anda
2. Implementasikan logging kesalahan yang tepat
3. Gunakan pesan kesalahan yang sesuai untuk pengguna akhir
4. Implementasikan logika retry untuk kesalahan sementara
5. Hubungi dukungan untuk masalah yang belum terpecahkan

## Dukungan

Untuk bantuan lebih lanjut dengan kode kesalahan atau masalah integrasi, silakan hubungi tim dukungan kami di [support@dodopayments.com](mailto:support@dodopayments.com).
