Dokumentasi API
Tipzy API Key untuk cek Saldo, Payment Gateway, Transfer Saldo antar user, dan Disbursement (pencairan ke rekening). Saldo yang dipotong selalu milik pemilik API Key.
Kelola key di Integrations → API.
Autentikasi
Sertakan API Key pada setiap request melalui header Authorization. Key hanya dapat digunakan dari alamat IP yang diizinkan jika kamu mengatur pembatasan IP saat membuat key.
Base URL
https://api.tipzy.idHeader (wajib)
Authorization: Bearer <api-key>Header (disarankan)
User-Agent: <app-name>/1.0Callback URL & Redirect URL
Diatur sekali di halaman API Key, berlaku otomatis untuk setiap pembayaran yang dibuat dengan key tersebut. Tidak dikirim sebagai body request.
Redirect URL
Ke mana pembayar diarahkan di halaman sukses setelah pembayaran berhasil. Kosongkan untuk memakai halaman Tipzy bawaan.
Callback URL
Tipzy mengirim satu kali HTTP POST ke URL ini (harus https://, tidak boleh alamat internal) setiap pembayaran sukses lewat key ini.
Contoh body callback
{
"event": "payment.success",
"data": {
"id": "01HXYZ…",
"status": "success",
"amount": 50000,
"payment_method": "qris",
"payment_url": "https://tipzy.id/donation/transaction/01HXYZ…",
"status_page_url": "https://tipzy.id/donation/transaction/01HXYZ…/status",
"created_at": "2026-08-11T06:30:00.000Z",
"paid_at": "2026-08-11T06:31:12.000Z",
"payer_name": "Budi",
"payer_email": "budi@email.com",
"message": "Pembayaran order #123"
}
}Memvalidasi Callback
Apabila Callback Secret diisi, body callback ditandatangani dengan HMAC SHA-256 pada header X-Tipzy-Signature. Contoh di Node.js:
const crypto = require("crypto");
const computedSignature = crypto
.createHmac("sha256", callbackSecret)
.update(JSON.stringify(callbackBody))
.digest("hex");
return crypto.timingSafeEqual(
Buffer.from(computedSignature),
Buffer.from(tipzySignatureFromHeader)
);GET /api/v1/gateway/payment-channels
Metode Pembayaran
Daftar channel yang sedang diaktifkan platform (Tipzy). Create Transaction hanya menerima kode dari daftar ini. Jika platform mengaktifkan VA / e-wallet baru, channel tersebut otomatis muncul di sini dan bisa dipakai tanpa perubahan API.
Contoh request
curl https://api.tipzy.id/api/v1/gateway/payment-channels \
-H "Authorization: Bearer <api-key>" \
-H "User-Agent: MyApp/1.0"Contoh response 200
{
"success": true,
"result": {
"countries": [
{
"code": "ID",
"label": "Indonesia",
"currency": "IDR",
"channels": [
{
"code": "QRIS",
"label": "QRIS",
"presentation": "qr",
"payment_category": "qris",
"requires_phone": false,
"icon_url": "https://…/qris.svg"
},
{
"code": "BCA_VIRTUAL_ACCOUNT",
"label": "BCA Virtual Account",
"presentation": "present",
"payment_category": "bank_transfer",
"requires_phone": false,
"icon_url": "https://…/logo-bca.png"
},
{
"code": "DANA",
"label": "DANA",
"presentation": "redirect",
"payment_category": "ewallet",
"requires_phone": true,
"icon_url": "https://…/dana.svg"
},
{
"code": "OVO",
"label": "OVO",
"presentation": "push",
"payment_category": "ewallet",
"requires_phone": true,
"icon_url": "https://…/ovo.svg"
}
]
}
]
}
}presentation: qr (QRIS), present (VA / kode retail), redirect (e-wallet redirect, mis. DANA / GoPay / ShopeePay), push (e-wallet push, mis. OVO). payment_category: qris, ewallet, bank_transfer, retail.
Referensi kode channel (Indonesia / ID)
Pakai nilai kolom code sebagai payment_channel saat Create Transaction. Kolom Aktif mengikuti setting platform saat ini (★ = diaktifkan admin). Channel nonaktif tetap tercantum sebagai referensi kode, tapi Create Transaction akan menolaknya.
QRIS / QR
qrisQRISQRIS
presentation: qr
| Code | Nama | Presentation | Phone | Aktif |
|---|---|---|---|---|
| QRIS | QRIS | qr | — | … |
E-Wallet
ewalletOVOOVO
presentation: push · phone: wajib
DANADANA
presentation: redirect · phone: wajib
GOPAYGoPay
presentation: redirect · phone: wajib
SHOPEEPAYShopeePay
presentation: redirect · phone: wajib
LINKAJALinkAja
presentation: redirect · phone: wajib
ASTRAPAYAstraPay
presentation: redirect · phone: wajib
JENIUSPAYJenius Pay
presentation: push
AKULAKUAkulaku PayLater
presentation: redirect
KREDIVOKredivo PayLater
presentation: redirect
| Code | Nama | Presentation | Phone | Aktif |
|---|---|---|---|---|
| OVO | OVO | push | Wajib | … |
| DANA | DANA | redirect | Wajib | … |
| GOPAY | GoPay | redirect | Wajib | … |
| SHOPEEPAY | ShopeePay | redirect | Wajib | … |
| LINKAJA | LinkAja | redirect | Wajib | … |
| ASTRAPAY | AstraPay | redirect | Wajib | … |
| JENIUSPAY | Jenius Pay | push | — | … |
| AKULAKU | Akulaku PayLater | redirect | — | … |
| KREDIVO | Kredivo PayLater | redirect | — | … |
Virtual Account
bank_transferBCA_VIRTUAL_ACCOUNTBCA Virtual Account
presentation: present
BJB_VIRTUAL_ACCOUNTBJB Virtual Account
presentation: present
BNI_VIRTUAL_ACCOUNTBNI Virtual Account
presentation: present
BRI_VIRTUAL_ACCOUNTBRI Virtual Account
presentation: present
MANDIRI_VIRTUAL_ACCOUNTMandiri Virtual Account
presentation: present
BSI_VIRTUAL_ACCOUNTBSI Virtual Account
presentation: present
BNC_VIRTUAL_ACCOUNTBNC Virtual Account
presentation: present
BSS_VIRTUAL_ACCOUNTBSS Virtual Account
presentation: present
PERMATA_VIRTUAL_ACCOUNTPermata Virtual Account
presentation: present
MUAMALAT_VIRTUAL_ACCOUNTMuamalat Virtual Account
presentation: present
CIMB_VIRTUAL_ACCOUNTCIMB Niaga Virtual Account
presentation: present
| Code | Nama | Presentation | Phone | Aktif |
|---|---|---|---|---|
| BCA_VIRTUAL_ACCOUNT | BCA Virtual Account | present | — | … |
| BJB_VIRTUAL_ACCOUNT | BJB Virtual Account | present | — | … |
| BNI_VIRTUAL_ACCOUNT | BNI Virtual Account | present | — | … |
| BRI_VIRTUAL_ACCOUNT | BRI Virtual Account | present | — | … |
| MANDIRI_VIRTUAL_ACCOUNT | Mandiri Virtual Account | present | — | … |
| BSI_VIRTUAL_ACCOUNT | BSI Virtual Account | present | — | … |
| BNC_VIRTUAL_ACCOUNT | BNC Virtual Account | present | — | … |
| BSS_VIRTUAL_ACCOUNT | BSS Virtual Account | present | — | … |
| PERMATA_VIRTUAL_ACCOUNT | Permata Virtual Account | present | — | … |
| MUAMALAT_VIRTUAL_ACCOUNT | Muamalat Virtual Account | present | — | … |
| CIMB_VIRTUAL_ACCOUNT | CIMB Niaga Virtual Account | present | — | … |
Retail Outlet
retailALFAMARTAlfamart
presentation: present
INDOMARETIndomaret
presentation: present
| Code | Nama | Presentation | Phone | Aktif |
|---|---|---|---|---|
| ALFAMART | Alfamart | present | — | … |
| INDOMARET | Indomaret | present | — | … |
Negara lain di katalog (jika diaktifkan admin): MY (Malaysia), PH (Filipina), TH (Thailand), SG (Singapura), VN (Vietnam). Kode channel per negara mengikuti response GET /payment-channels.
POST /api/v1/gateway/transactions
Buat Transaksi
Membuat transaksi pembayaran ke akun pemilik API Key untuk semua channel yang aktif (QRIS, Virtual Account, e-wallet, dll — sesuai payment-channels). Bukan QRIS-only. Pembayaran Saldo Tipzy tidak tersedia untuk API Key.
Field instrumen di response (pending)
payment_category—qris,ewallet,bank_transfer,retail.instrument_type—qr,virtual_account,payment_code,redirect, ataupush.qr_string— payload QRIS EMV (tipeqr). Untuk VA, field ini diisi nomor VA agar kompatibel dengan client lama; prefervirtual_account_number.virtual_account_number— nomor VA (mis.BCA_VIRTUAL_ACCOUNT).payment_code— kode bayar retail (Alfamart / Indomaret) jika channel itu aktif.ewallet_redirect_url/payment_checkout_url— URL checkout e-wallet tiperedirect(DANA, GoPay, ShopeePay, LinkAja, …). Arahkan pembayar ke URL ini.- E-wallet
push(OVO): tidak ada URL redirect — notifikasi push dikirim ke nomorphoneyang dikirim di request. - Setelah lunas / expired, field instrumen dikosongkan (
null).
namestringNama pembayar (juga dipakai sebagai nama VA / customer_name)
emailstringEmail pembayar
amountnumberNominal IDR (min sesuai setting Tipzy)
payment_channelstringKode channel aktif (GET /payment-channels). Contoh: QRIS, BCA_VIRTUAL_ACCOUNT, DANA, OVO, GOPAY, SHOPEEPAY, LINKAJA.
payment_countrystringOpsional, default ID. Harus negara yang diaktifkan admin.
messagestringOpsional
phonestringWajib untuk e-wallet (DANA/OVO/GOPAY/dll). Format 08xxxxxxxxxx. Lihat requires_phone di payment-channels.
| Parameter | Tipe | Keterangan |
|---|---|---|
| name | string | Nama pembayar (juga dipakai sebagai nama VA / customer_name) |
| string | Email pembayar | |
| amount | number | Nominal IDR (min sesuai setting Tipzy) |
| payment_channel | string | Kode channel aktif (GET /payment-channels). Contoh: QRIS, BCA_VIRTUAL_ACCOUNT, DANA, OVO, GOPAY, SHOPEEPAY, LINKAJA. |
| payment_country | string | Opsional, default ID. Harus negara yang diaktifkan admin. |
| message | string | Opsional |
| phone | string | Wajib untuk e-wallet (DANA/OVO/GOPAY/dll). Format 08xxxxxxxxxx. Lihat requires_phone di payment-channels. |
Contoh request (QRIS)
curl -X POST https://api.tipzy.id/api/v1/gateway/transactions \
-H "Authorization: Bearer <api-key>" \
-H "User-Agent: MyApp/1.0" \
-H "Content-Type: application/json" \
-d '{
"name": "Budi",
"email": "budi@email.com",
"amount": 50000,
"payment_channel": "QRIS",
"message": "Pembayaran order #123"
}'Contoh response 201 (QRIS)
{
"success": true,
"result": {
"success": true,
"transaction_id": "01HXYZ…",
"cancel_token": "…",
"payment_url": "https://tipzy.id/donation/transaction/01HXYZ…",
"status_page_url": "https://tipzy.id/donation/transaction/01HXYZ…/status",
"status": "pending",
"amount": 50000,
"payment_method": "qris",
"payment_country": "ID",
"payment_channel": "QRIS",
"payment_channel_label": "QRIS",
"payment_currency": "IDR",
"payment_category": "qris",
"presentation": "qr",
"instrument_type": "qr",
"donation_amount_idr": 50000,
"payment_fee_idr": 0,
"payment_total_idr": 50000,
"payment_charge_amount": 50000,
"payment_expiration_seconds": 1800,
"payment_expires_at": "2026-08-11T07:00:00.000Z",
"qr_string": "00020101021226650016ID.CO.QRIS.WWW…",
"qr_url": null,
"payment_checkout_url": null,
"ewallet_redirect_url": null,
"virtual_account_number": null,
"payment_code": null,
"requires_phone": false,
"created_at": "2026-08-11T06:30:00.000Z"
}
}Contoh request (Virtual Account)
curl -X POST https://api.tipzy.id/api/v1/gateway/transactions \
-H "Authorization: Bearer <api-key>" \
-H "User-Agent: MyApp/1.0" \
-H "Content-Type: application/json" \
-d '{
"name": "Budi",
"email": "budi@email.com",
"amount": 50000,
"payment_channel": "BCA_VIRTUAL_ACCOUNT",
"payment_country": "ID",
"message": "Pembayaran order #123"
}'Contoh response 201 (Virtual Account)
{
"success": true,
"result": {
"success": true,
"transaction_id": "01HXYZ…",
"cancel_token": "…",
"payment_url": "https://tipzy.id/donation/transaction/01HXYZ…",
"status_page_url": "https://tipzy.id/donation/transaction/01HXYZ…/status",
"status": "pending",
"amount": 50000,
"payment_method": "bca_virtual_account",
"payment_country": "ID",
"payment_channel": "BCA_VIRTUAL_ACCOUNT",
"payment_channel_label": "BCA Virtual Account",
"payment_currency": "IDR",
"payment_category": "bank_transfer",
"presentation": "present",
"instrument_type": "virtual_account",
"donation_amount_idr": 50000,
"payment_fee_idr": 0,
"payment_total_idr": 50000,
"payment_charge_amount": 50000,
"payment_expiration_seconds": 1800,
"payment_expires_at": "2026-08-11T07:00:00.000Z",
"qr_string": "7001987654321",
"qr_url": null,
"payment_checkout_url": null,
"ewallet_redirect_url": null,
"virtual_account_number": "7001987654321",
"payment_code": null,
"requires_phone": false,
"created_at": "2026-08-11T06:30:00.000Z"
}
}Contoh request (e-wallet redirect — DANA)
curl -X POST https://api.tipzy.id/api/v1/gateway/transactions \
-H "Authorization: Bearer <api-key>" \
-H "User-Agent: MyApp/1.0" \
-H "Content-Type: application/json" \
-d '{
"name": "Budi",
"email": "budi@email.com",
"phone": "081234567890",
"amount": 25000,
"payment_channel": "DANA",
"payment_country": "ID",
"message": "Pembayaran order #123"
}'Contoh response 201 (e-wallet redirect)
{
"success": true,
"result": {
"success": true,
"transaction_id": "01HXYZ…",
"cancel_token": "…",
"payment_url": "https://tipzy.id/donation/transaction/01HXYZ…",
"status_page_url": "https://tipzy.id/donation/transaction/01HXYZ…/status",
"status": "pending",
"amount": 25000,
"payment_method": "dana",
"payment_country": "ID",
"payment_channel": "DANA",
"payment_channel_label": "DANA",
"payment_currency": "IDR",
"payment_category": "ewallet",
"presentation": "redirect",
"instrument_type": "redirect",
"donation_amount_idr": 25000,
"payment_fee_idr": 0,
"payment_total_idr": 25000,
"payment_charge_amount": 25000,
"payment_expiration_seconds": 1800,
"payment_expires_at": "2026-08-11T07:00:00.000Z",
"qr_string": null,
"qr_url": "https://m.dana.id/n/link/checkout/xyz",
"payment_checkout_url": "https://m.dana.id/n/link/checkout/xyz",
"ewallet_redirect_url": "https://m.dana.id/n/link/checkout/xyz",
"virtual_account_number": null,
"payment_code": null,
"requires_phone": true,
"created_at": "2026-08-11T06:30:00.000Z"
}
}Contoh request (e-wallet push — OVO)
curl -X POST https://api.tipzy.id/api/v1/gateway/transactions \
-H "Authorization: Bearer <api-key>" \
-H "User-Agent: MyApp/1.0" \
-H "Content-Type: application/json" \
-d '{
"name": "Budi",
"email": "budi@email.com",
"phone": "081298765432",
"amount": 15000,
"payment_channel": "OVO",
"payment_country": "ID",
"message": "Pembayaran order #123"
}'Contoh response 201 (e-wallet push)
{
"success": true,
"result": {
"success": true,
"transaction_id": "01HXYZ…",
"cancel_token": "…",
"payment_url": "https://tipzy.id/donation/transaction/01HXYZ…",
"status_page_url": "https://tipzy.id/donation/transaction/01HXYZ…/status",
"status": "pending",
"amount": 15000,
"payment_method": "ovo",
"payment_country": "ID",
"payment_channel": "OVO",
"payment_channel_label": "OVO",
"payment_currency": "IDR",
"payment_category": "ewallet",
"presentation": "push",
"instrument_type": "push",
"donation_amount_idr": 15000,
"payment_fee_idr": 0,
"payment_total_idr": 15000,
"payment_charge_amount": 15000,
"payment_expiration_seconds": 1800,
"payment_expires_at": "2026-08-11T07:00:00.000Z",
"qr_string": null,
"qr_url": null,
"payment_checkout_url": null,
"ewallet_redirect_url": null,
"virtual_account_number": null,
"payment_code": null,
"requires_phone": true,
"created_at": "2026-08-11T06:30:00.000Z"
}
}GET /api/v1/gateway/transactions/{transaction_id}
Status Transaksi
Mengambil detail dan status transaksi berdasarkan transaction_id. API Key hanya dapat melihat transaksi yang dibuat dengan key yang sama. Status: pending, paid, expired, cancelled. Saat masih pending, response juga menyertakan qr_string, qr_url, dan field pembayaran lainnya (sama seperti Create Transaction), termasuk virtual_account_number untuk VA.
Contoh request
curl https://api.tipzy.id/api/v1/gateway/transactions/<transaction_id> \
-H "Authorization: Bearer <api-key>" \
-H "User-Agent: MyApp/1.0"Contoh response 200
{
"success": true,
"result": {
"id": "01HXYZ…",
"status": "pending",
"amount": 50000,
"payment_method": "qris",
"payment_url": "https://tipzy.id/donation/transaction/01HXYZ…",
"status_page_url": "https://tipzy.id/donation/transaction/01HXYZ…/status",
"redirect_url": null,
"payer_name": "Budi",
"payer_email": "budi@email.com",
"message": "Pembayaran order #123",
"created_at": "2026-08-11T06:30:00.000Z",
"paid_at": null,
"payment_country": "ID",
"payment_channel": "QRIS",
"payment_channel_label": "QRIS",
"payment_currency": "IDR",
"payment_category": "qris",
"presentation": "qr",
"instrument_type": "qr",
"donation_amount_idr": 50000,
"payment_fee_idr": 0,
"payment_total_idr": 50000,
"payment_charge_amount": 50000,
"payment_expiration_seconds": 1800,
"payment_expires_at": "2026-08-11T07:00:00.000Z",
"qr_string": "00020101021226650016ID.CO.QRIS.WWW…",
"qr_url": null,
"payment_checkout_url": null,
"ewallet_redirect_url": null,
"virtual_account_number": null,
"payment_code": null,
"requires_phone": false
}
}GET /api/v1/gateway/balance
Saldo Tipzy
Mengembalikan Saldo Tipzy pemilik API Key (siap dipakai untuk Transfer Saldo / Disbursement). Tidak perlu signature MD5 — cukup Bearer token. Saldo yang sedang dicadangkan untuk pencairan pending sudah terpotong dari nilai balance.
Contoh request
curl https://api.tipzy.id/api/v1/gateway/balance \
-H "Authorization: Bearer <api-key>" \
-H "User-Agent: MyApp/1.0"Contoh response 200
{
"success": true,
"result": {
"username": "streamer123",
"balance": 125000,
"currency": "IDR",
"fee_cashout": 5000
}
}fee_cashout — biaya pencairan efektif akun (IDR). Untuk Disbursement, total debit ≈ amount + fee_cashout.
POST /api/v1/gateway/send-balance
Transfer Saldo (Kirim Saldo)
Mengirim Saldo Tipzy dari akun pemilik API Key ke user Tipzy lain secara instan. Wajib header Authorization: Bearer <api-key> dan signature MD5 di body.
Cara hitung MD5 (rinci)
- Normalisasi field: string di-
trim, amount & startSecond jadi integer. - Concat tanpa pemisah berurutan:
preferedName + receiverUserName + amount + mediaShareUrl + startSecond + message + merchantCode + apiKey. - Hash:
md5(payload)→ 32 karakter hex lowercase. - Field kosong tetap dihitung sebagai string kosong (
""), bukan dihapus dari urutan.
Formula signature (MD5 lowercase)
md5(preferedName + receiverUserName + amount + mediaShareUrl + startSecond + message + merchantCode + apiKey)Contoh hitung token (Node.js)
const crypto = require("crypto");
// Nilai di bawah = nilai SETELAH normalisasi Tipzy (trim),
// dan HARUS sama persis dengan yang dikirim di JSON body.
const preferedName = "PartnerBot"; // string (boleh "")
const receiverUserName = "streamer123"; // case-sensitive
const amount = 5000; // integer
const mediaShareUrl = ""; // string (boleh "")
const startSecond = 0; // integer (>= 0)
const message = "Semangat streaming!"; // string (boleh "")
const merchantCode = "tipzy-k7m2xq9ph3n1";
const apiKey = "tipzy_xxxxxxxx"; // Bearer token mentah
// Urutan concat WAJIB seperti ini (tanpa pemisah):
const payload =
preferedName +
receiverUserName +
String(amount) +
mediaShareUrl +
String(startSecond) +
message +
merchantCode +
apiKey;
// Contoh payload:
// PartnerBotstreamer12350000Semangat streaming!tipzy-k7m2xq9ph3n1tipzy_xxxxxxxx
const token = crypto.createHash("md5").update(payload, "utf8").digest("hex");
// token = 32 hex lowercasepreferedNamestringOpsional. Nama pengirim di overlay (max 100, di-trim). Kosong = nama akun pemilik key. Tetap ikut MD5.
receiverUserNamestringWajib. Username penerima Tipzy (max 20, alpha_dash, case-sensitive, di-trim).
amountnumberWajib. Integer IDR (min sesuai setting Tipzy). Di MD5 sebagai String(amount).
mediaShareUrlstringOpsional. URL mediashare. Kosong = "". Tetap ikut MD5.
startSecondnumberOpsional. Detik mulai mediashare. Default 0. Di MD5 sebagai String(startSecond).
messagestringOpsional. Pesan (max 400, di-trim). Kosong = "". Tetap ikut MD5.
merchantCodestringWajib. Merchant code API Key (halaman API Keys). Stabil saat regenerate token.
tokenstringWajib. MD5 lowercase 32 hex dari concat field (lihat formula).
| Parameter | Tipe | Keterangan |
|---|---|---|
| preferedName | string | Opsional. Nama pengirim di overlay (max 100, di-trim). Kosong = nama akun pemilik key. Tetap ikut MD5. |
| receiverUserName | string | Wajib. Username penerima Tipzy (max 20, alpha_dash, case-sensitive, di-trim). |
| amount | number | Wajib. Integer IDR (min sesuai setting Tipzy). Di MD5 sebagai String(amount). |
| mediaShareUrl | string | Opsional. URL mediashare. Kosong = "". Tetap ikut MD5. |
| startSecond | number | Opsional. Detik mulai mediashare. Default 0. Di MD5 sebagai String(startSecond). |
| message | string | Opsional. Pesan (max 400, di-trim). Kosong = "". Tetap ikut MD5. |
| merchantCode | string | Wajib. Merchant code API Key (halaman API Keys). Stabil saat regenerate token. |
| token | string | Wajib. MD5 lowercase 32 hex dari concat field (lihat formula). |
Contoh request
curl -X POST https://api.tipzy.id/api/v1/gateway/send-balance \
-H "Authorization: Bearer <api-key>" \
-H "User-Agent: MyApp/1.0" \
-H "Content-Type: application/json" \
-d '{
"preferedName": "PartnerBot",
"receiverUserName": "streamer123",
"amount": 5000,
"mediaShareUrl": "",
"startSecond": 0,
"message": "Semangat streaming!",
"merchantCode": "tipzy-k7m2xq9ph3n1",
"token": "<md5(preferedName+receiverUserName+amount+mediaShareUrl+startSecond+message+merchantCode+apiKey)>"
}'Contoh response 200
{
"data": "01HXYZ…|5000",
"success": true,
"message": "Success"
}Response sukses: data berformat transaction_id|amount.
Idempotensi: request dengan signature MD5 yang sama dalam 24 jam mengembalikan hasil sebelumnya (tanpa debit ulang).
Callback: transfer wallet tidak mengirim payment.success. Event itu hanya untuk pembayaran gateway (QRIS/VA/dll).
Rate limit: sekitar 15 req/menit per API key untuk endpoint ini.
POST /api/v1/gateway/disbursements
Disbursement
Mencairkan Saldo Tipzy pemilik API Key ke rekening tujuan di request. Tidak perlu verifikasi email dan tidak memakai bank di profil. Saat request diterima, saldo dicadangkan (nominal + fee); multi-payout hampir bersamaan diperbolehkan selama saldo cukup.
Cara hitung MD5 (rinci)
- Normalisasi:
channelCode→ trim + UPPERCASE; nomor rekening / nama / merchantCode → trim;amount→ integer. - Concat tanpa pemisah:
amount + channelCode + accountNumber + accountHolder + merchantCode + apiKey. referencedandescriptiontidak masuk MD5.- Hash MD5 lowercase 32 hex. Contoh channel:
ID_BCA,ID_MANDIRI,ID_BTN,ID_DANA.
Formula signature (MD5 lowercase)
md5(amount + channelCode + accountNumber + accountHolder + merchantCode + apiKey)Contoh hitung token (Node.js)
const crypto = require("crypto");
// Nilai SETELAH normalisasi Tipzy:
// - channelCode: trim + UPPERCASE (contoh: "id_bca" → "ID_BCA")
// - accountNumber / accountHolder / merchantCode: trim
// - amount: integer (tanpa pemisah ribuan)
const amount = 100000;
const channelCode = "ID_BCA";
const accountNumber = "1234567890";
const accountHolder = "FARIZAL";
const merchantCode = "tipzy-k7m2xq9ph3n1";
const apiKey = "tipzy_xxxxxxxx";
// Urutan concat WAJIB (tanpa pemisah). reference & description TIDAK masuk signature.
const payload =
String(amount) +
channelCode +
accountNumber +
accountHolder +
merchantCode +
apiKey;
// Contoh payload:
// 100000ID_BCA1234567890FARIZALtipzy-k7m2xq9ph3n1tipzy_xxxxxxxx
const token = crypto.createHash("md5").update(payload, "utf8").digest("hex");amountnumberWajib. Nominal ke rekening (min Rp 5.000). Fee cashout dipotong terpisah dari saldo.
channelCodestringWajib. Di-normalisasi ke UPPERCASE sebelum MD5 (pakai ID_BCA / ID_MANDIRI / ID_BTN, atau alias bank Tipzy).
accountNumberstringWajib. Nomor rekening / e-wallet (di-trim). MD5 memakai nilai setelah trim.
accountHolderstringWajib. Nama pemilik (di-trim, max 100). MD5 memakai nilai setelah trim.
merchantCodestringWajib. Merchant code API Key.
tokenstringWajib. MD5(amount+channelCode+accountNumber+accountHolder+merchantCode+apiKey).
referencestringSangat disarankan. Idempotency key per API Key (max 128). Tidak masuk MD5. Request ulang dengan reference sama mengembalikan transaksi yang sama.
descriptionstringOpsional. Berita transfer / description (max 100). Alias: berita, beritaTransfer. Tidak masuk MD5. Default: Tipzy withdraw @{username}. Bank sering memotong lebih pendek (mis. BCA ~15 karakter).
| Parameter | Tipe | Keterangan |
|---|---|---|
| amount | number | Wajib. Nominal ke rekening (min Rp 5.000). Fee cashout dipotong terpisah dari saldo. |
| channelCode | string | Wajib. Di-normalisasi ke UPPERCASE sebelum MD5 (pakai ID_BCA / ID_MANDIRI / ID_BTN, atau alias bank Tipzy). |
| accountNumber | string | Wajib. Nomor rekening / e-wallet (di-trim). MD5 memakai nilai setelah trim. |
| accountHolder | string | Wajib. Nama pemilik (di-trim, max 100). MD5 memakai nilai setelah trim. |
| merchantCode | string | Wajib. Merchant code API Key. |
| token | string | Wajib. MD5(amount+channelCode+accountNumber+accountHolder+merchantCode+apiKey). |
| reference | string | Sangat disarankan. Idempotency key per API Key (max 128). Tidak masuk MD5. Request ulang dengan reference sama mengembalikan transaksi yang sama. |
| description | string | Opsional. Berita transfer / description (max 100). Alias: berita, beritaTransfer. Tidak masuk MD5. Default: Tipzy withdraw @{username}. Bank sering memotong lebih pendek (mis. BCA ~15 karakter). |
Contoh request
curl -X POST https://api.tipzy.id/api/v1/gateway/disbursements \
-H "Authorization: Bearer <api-key>" \
-H "User-Agent: MyApp/1.0" \
-H "Content-Type: application/json" \
-d '{
"amount": 100000,
"channelCode": "ID_BCA",
"accountNumber": "1234567890",
"accountHolder": "FARIZAL",
"merchantCode": "tipzy-k7m2xq9ph3n1",
"token": "<md5(amount+channelCode+accountNumber+accountHolder+merchantCode+apiKey)>",
"reference": "order-99",
"description": "Tipzy WD order99"
}'Contoh response 201
{
"success": true,
"result": {
"transaction_id": "01HXYZ…",
"status": "pending",
"amount": 100000,
"fee": 5000,
"total_debit": 105000,
"channel_code": "ID_BCA",
"account_number": "1234567890",
"account_holder": "FARIZAL",
"reference": "order-99",
"description": "Tipzy WD order99",
"failure_reason": null,
"created_at": "2026-09-05T08:00:00.000Z",
"paid_at": null
}
}Debit saldo: total_debit = amount + fee saat reserve sukses. Gagal ke bank → saldo dikembalikan.
Idempotensi: (1) kirim reference unik per order — request ulang dengan reference sama = transaksi yang sama; (2) tanpa reference, signature MD5 yang sama dalam 24 jam juga di-replay (tidak debit ganda).
Description / berita: Field description dikirim sebagai description disbursement (muncul di Transactions report & sering di mutasi bank sebagai berita transfer). Bank bisa memotong teks; sebaiknya singkat. Tanpa field ini, default Tipzy withdraw @username.
Rate limit: sekitar 60 req/menit per API key. Callback (jika URL diatur): disbursement.succeeded / disbursement.failed dengan header X-Tipzy-Signature (HMAC-SHA256).
GET /api/v1/gateway/disbursements/{transaction_id}
Status Disbursement
Status: pending, succeeded, failed. Hanya transaksi milik API Key yang sama yang bisa dicek.
Contoh request
curl https://api.tipzy.id/api/v1/gateway/disbursements/<transaction_id> \
-H "Authorization: Bearer <api-key>" \
-H "User-Agent: MyApp/1.0"