API Validasi Kupon (v2)

API Validasi Kupon Vivoldi memungkinkan Anda memeriksa apakah kupon valid sebelum diproses penggunaannya.

Selain memeriksa ketersediaan, API ini juga mengembalikan informasi diskon, syarat penggunaan, dan data pengguna untuk mendukung logika bisnis yang fleksibel.

API ini tersedia mulai dari paket Personal.

GET

/api/coupon/v2/validate?cpnNo={cpnNo}


GET /api/coupon/v2/validate
     ?cpnNo=ZJLF0399WQBEQZJM
     &processStoreIdx=22

Request Parameters

cpnNostringrequired
Nomor kupon.
processStoreIdx integer
IDX toko tempat permintaan ini benar-benar diproses. Jika dikirim, server memverifikasi kepemilikan organisasi, status aktif, dan izin sebelum mencatatnya dalam riwayat pemrosesan.
Cabang pemrosesan tidak diambil dari permintaan; server menentukannya dari toko ini. Nilai ini berbeda dari toko penerbit (storeIdx).
{
    "code": 0,
    "message": "",
    "result": {
        "cpnNo": "ZJLF0399WQBEQZJM",
        "domain": "https://vvd.bz",
        "nm": "$100 off cake coupon",
        "grpIdx": 271,
        "grpNm": "Birthday coupon",
        "discTypeIdx": 457,
        "discCurrency": "USD",
        "formatDiscCurrency": "$60",
        "disc": 60.0,
        "strtYmd": "2025-01-01",
        "endYmd": "2025-12-31",
        "useLimit": 1,
        "imgUrl": "https://file.vivoldi.com/coupon/2024/11/08/lmTFkqLQdCzeBuPdONKG.webp",
        "onsiteYn": "Y",
        "onsiteToken": "QsBkV0ryiCkxiV4KUNJBSWQcR8MzSlvez4ntLh2Tt2M",
        "onsiteTokenExpiresIn": 180,
        "memo": "60% off cake with coupon at the venue",
        "url": "",
        "userId": "user08",
        "userNm": "Emily",
        "userPhnno": "202-555-0173",
        "userEml": "test@gmail.com",
        "userEtc1": "",
        "userEtc2": "",
        "useCnt": 0,
        "regYmdt": "2024-11-17 17:29:25",
        "branchIdx": 11,
        "branchNm": "Gangnam Branch",
        "storeIdx": 22,
        "storeNm": "Gangnam Station Store",
        "issueScope": "BRANCH",
        "useScope": "BRANCH",
        "useBranchIdx": 11,
        "useBranchNm": "Gangnam Branch"
    }
}

Response Parameters

codeinteger
Kode respons: 0 = Berhasil, nilai lain = Error
messagestring
Pesan respons. Jika kode tidak sama dengan 0, pesan kesalahan akan dikembalikan.
resultobject
Berhasil diverifikasi: Respons mengembalikan informasi kupon.
Gagal diverifikasi: Respons bernilai null dan dapat dilihat melalui pesan kesalahan.
cpnNostring
Nomor kupon.
domain string
Domain kupon.
nmstring
Nama kupon.
discTypeIdxinteger
Jenis diskon. (457: diskon persentase %, 458: diskon nominal)
discdouble
Untuk persentase (457): rentang 1–100%. Untuk nominal (458): masukkan jumlah.
discCurrencystring
Mata uang. Wajib diisi jika menggunakan diskon nominal (discTypeIdx:458).
formatDiscCurrencystring
Simbol mata uang.
strtYmddate
Tanggal mulai berlaku kupon.
endYmddate
Tanggal kedaluwarsa kupon.
useLimitinteger
Batas penggunaan kupon. (0: tanpa batas, 1–5: jumlah penggunaan terbatas)
imgUrlstring
URL gambar kupon.
onsiteYnstring
Kupon di lokasi. Menentukan apakah tombol “Gunakan Kupon” ditampilkan di halaman kupon.
Dibutuhkan saat kupon digunakan di toko offline.
onsiteToken string
Token pertukaran berjangka pendek untuk pemrosesan di lokasi.
Menggantikan teks biasa onsitePwd yang dikembalikan v1. Ini bukan faktor autentikasi tambahan; tujuannya agar kata sandi jangka panjang tidak tersimpan di respons dan log integrasi.
Kedaluwarsa setelah 180 detik, hanya dapat dipakai sekali, dan tidak dapat digunakan ulang untuk organisasi, sumber daya, tindakan, atau toko pemroses lain. Tidak diterbitkan jika sumber daya tidak memakai autentikasi di lokasi (onsiteYn = N).
onsiteTokenExpiresIn integer
Masa berlaku token dalam detik. Tidak ada jika token tidak diterbitkan.
memostring
Catatan referensi internal.
urlstring
Jika URL dimasukkan, tombol “Pergi Gunakan Kupon” akan ditampilkan di halaman kupon.
Mengklik tombol atau gambar kupon akan mengarahkan ke URL tersebut.
userIdstring
Digunakan untuk mengelola penerima kupon.
Wajib diisi jika batas penggunaan kupon diatur 2–5 kali.
Biasanya diisi dengan ID login anggota situs atau nama dalam bahasa Inggris.
userNmstring
Nama pengguna kupon. Untuk penggunaan internal.
userPhnnostring
Nomor telepon pengguna kupon. Untuk penggunaan internal.
userEmlstring
Email pengguna kupon. Untuk penggunaan internal.
userEtc1string
Bidang tambahan untuk penggunaan internal.
userEtc2string
Bidang tambahan untuk penggunaan internal.
useCntinteger
Jumlah penggunaan kupon.
regYmdtdatetime
Tanggal pembuatan kupon. Contoh: 2025-07-21 11:50:20
branchIdx integer
IDX cabang penerbit. null jika diterbitkan kantor pusat. Ini adalah lokasi penerbitan, bukan cabang tempat permintaan ini diproses.
branchNm string
Nama cabang penerbit. null jika diterbitkan kantor pusat. Nama tetap dikembalikan meskipun cabang dinonaktifkan.
storeIdx integer
IDX toko penerbit. null jika tidak ditentukan. Berbeda dari toko pemroses.
storeNm string
Nama toko penerbit. null jika toko penerbit tidak ditentukan. Nama tetap dikembalikan meskipun toko dinonaktifkan.
issueScope string
Jenis penerbitan. HEAD_OFFICE (diterbitkan kantor pusat) atau BRANCH (diterbitkan cabang). Bernilai HEAD_OFFICE jika branchIdx adalah null.
useScope string
Cakupan penggunaan. ALL (semua toko) atau BRANCH (cabang tertentu).
useBranchIdx integer
IDX cabang tempat penggunaan. Hanya berisi nilai saat useScope = BRANCH; null jika ALL.
useBranchNm string
Nama cabang tempat penggunaan. Hanya berisi nilai saat useScope = BRANCH; null jika ALL. Nama tetap dikembalikan meskipun cabang dinonaktifkan.

Token verifikasi di toko (onsiteToken)

Respons API Validasi v2 tidak menyertakan kata sandi toko dalam bentuk teks biasa (onsitePwd). Sebagai gantinya, API mengembalikan onsiteToken yang berlaku selama 180 detik.

Tujuannya adalah meminimalkan paparan kata sandi dalam teks biasa, bukan memperkuat autentikasi. API Validasi tidak memverifikasi kata sandi itu sendiri, sehingga token ini tidak menambahkan faktor autentikasi baru. Masa berlaku yang singkat, penggunaan satu kali, dan pengikatan konteks membatasi penggunaan ulang token.

Item Nilai
Masa berlaku 180 detik. Masa berlaku juga dikembalikan melalui onsiteTokenExpiresIn.
Jumlah penggunaan Satu kali. Setelah token digunakan, hanya percobaan ulang dengan Idempotency-Key yang sama yang mengembalikan hasil awal.
Pengikatan Organisasi, akun kunci API, sumber daya, tindakan, dan toko pemroses yang dikonfirmasi saat validasi
Digunakan untuk Penukaran kupon, penukaran hadiah stempel, dan pembaruan stempel dengan useYn = Y

Token tidak diterbitkan untuk sumber daya yang tidak menggunakan verifikasi di toko (onsiteYn = N). API Validasi v1 tetap mengembalikan onsitePwd dalam bentuk teks biasa.

Menentukan toko pemroses

Parameter Arti Deskripsi
processStoreIdx Toko pemroses Toko tempat permintaan ini benar-benar diproses. Opsional; jika dikirim, server memverifikasi kepemilikan organisasi, status aktif, dan izin sebelum mencatatnya dalam riwayat pemrosesan.

Cabang pemroses tidak diterima dari permintaan. Server menentukannya dari toko yang Anda tentukan dan mencatatnya.

Jika cakupan penggunaan adalah BRANCH, permintaan hanya diproses bila cabang toko pemroses yang terverifikasi sama dengan cabang penggunaan, atau bila Anda melakukan autentikasi dengan kata sandi di tempat cabang tersebut. Tanpa keduanya, permintaan ditolak.

Parameter yang tidak dapat digunakan — branchIdx (cabang penerbit), storeIdx (toko penerbit), useScope (cakupan penggunaan), dan useBranchIdx (cabang penggunaan) adalah kebijakan penerbitan yang sudah tersimpan dan tidak dapat diubah melalui API ini. Jika dikirim, akan ditolak dengan 400 (kode kesalahan 1227).

Apa yang dapat ditentukan dari hasil validasi?

API ini tidak hanya sekadar memeriksa “valid / tidak valid”.
Dirancang agar developer dapat membangun logika keputusan sendiri berdasarkan data kupon yang detail.

Dengan respons (result), Anda dapat menentukan:

  • Apakah diskon dapat diterapkan dan menghitung nilainya
  • Apakah kupon hanya berlaku untuk pengguna tertentu (userId, userEml)
  • Apakah batas penggunaan telah terlampaui (useCnt, useLimit)
  • Apakah kupon sudah kedaluwarsa atau belum aktif (strtYmd, endYmd)
  • Apakah kondisi tertentu terpenuhi (online/offline, dll.) (onsiteYn)
  • URL tujuan setelah kupon diterapkan (url)

Artinya, ini bukan sekadar hasil sederhana,
melainkan API berbasis data untuk logika fleksibel di level aplikasi.

Metode validasi

Validasi dilakukan berdasarkan kode kupon (cpNo) dengan mempertimbangkan berbagai kriteria.

  • Ketersediaan
  • Masa berlaku
  • Batas penggunaan
  • Syarat pengguna
  • Lingkungan penggunaan

Hasil dikembalikan dalam bentuk data terstruktur, bukan hanya nilai boolean sederhana.

Cara menggunakan data respons

Objek result berisi semua informasi utama kupon.

Developer dapat menggunakan data ini untuk:

  • Menghitung dan menampilkan diskon secara real-time di frontend
  • Membatasi penggunaan kupon hanya untuk pengguna tertentu
  • Menerapkan logika berdasarkan jumlah pembayaran
  • Menampilkan pesan UI sesuai status kupon (kedaluwarsa, sudah digunakan, dll.)

Contoh penggunaan

  • Validasi sebelum pembayaran: Validasi kupon terlebih dahulu dan terapkan hanya jika valid
  • Pesan pengguna: Tampilkan pesan sesuai hasil validasi (kedaluwarsa atau sudah digunakan)
  • Perhitungan diskon: Gunakan (disc, discType) untuk menghitung total pembayaran

Kode kupon yang sama dapat digunakan kembali setelah dihapus.

Hal yang perlu diperhatikan

  • Hasil validasi mencerminkan kondisi saat permintaan dan dapat berubah sebelum digunakan.
  • Selalu gunakan alur: validasi → penggunaan (Redeem).
  • Mengandalkan hanya validasi di sisi klien berisiko terhadap keamanan.
  • Lakukan verifikasi ulang perhitungan diskon di server untuk memastikan akurasi dan keamanan.