Developers

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.

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.id

Header (wajib)

Authorization: Bearer <api-key>

Header (disarankan)

User-Agent: <app-name>/1.0

Callback 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

qris
QRIS

QRIS

presentation: qr

E-Wallet

ewallet
OVO

OVO

presentation: push · phone: wajib

DANA

DANA

presentation: redirect · phone: wajib

GOPAY

GoPay

presentation: redirect · phone: wajib

SHOPEEPAY

ShopeePay

presentation: redirect · phone: wajib

LINKAJA

LinkAja

presentation: redirect · phone: wajib

ASTRAPAY

AstraPay

presentation: redirect · phone: wajib

JENIUSPAY

Jenius Pay

presentation: push

AKULAKU

Akulaku PayLater

presentation: redirect

KREDIVO

Kredivo PayLater

presentation: redirect

Virtual Account

bank_transfer
BCA_VIRTUAL_ACCOUNT

BCA Virtual Account

presentation: present

BJB_VIRTUAL_ACCOUNT

BJB Virtual Account

presentation: present

BNI_VIRTUAL_ACCOUNT

BNI Virtual Account

presentation: present

BRI_VIRTUAL_ACCOUNT

BRI Virtual Account

presentation: present

MANDIRI_VIRTUAL_ACCOUNT

Mandiri Virtual Account

presentation: present

BSI_VIRTUAL_ACCOUNT

BSI Virtual Account

presentation: present

BNC_VIRTUAL_ACCOUNT

BNC Virtual Account

presentation: present

BSS_VIRTUAL_ACCOUNT

BSS Virtual Account

presentation: present

PERMATA_VIRTUAL_ACCOUNT

Permata Virtual Account

presentation: present

MUAMALAT_VIRTUAL_ACCOUNT

Muamalat Virtual Account

presentation: present

CIMB_VIRTUAL_ACCOUNT

CIMB Niaga Virtual Account

presentation: present

Retail Outlet

retail
ALFAMART

Alfamart

presentation: present

INDOMARET

Indomaret

presentation: 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, atau push.
  • qr_string — payload QRIS EMV (tipe qr). Untuk VA, field ini diisi nomor VA agar kompatibel dengan client lama; prefer virtual_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 tipe redirect (DANA, GoPay, ShopeePay, LinkAja, …). Arahkan pembayar ke URL ini.
  • E-wallet push (OVO): tidak ada URL redirect — notifikasi push dikirim ke nomor phone yang dikirim di request.
  • Setelah lunas / expired, field instrumen dikosongkan (null).
namestring

Nama pembayar (juga dipakai sebagai nama VA / customer_name)

emailstring

Email pembayar

amountnumber

Nominal IDR (min sesuai setting Tipzy)

payment_channelstring

Kode channel aktif (GET /payment-channels). Contoh: QRIS, BCA_VIRTUAL_ACCOUNT, DANA, OVO, GOPAY, SHOPEEPAY, LINKAJA.

payment_countrystring

Opsional, default ID. Harus negara yang diaktifkan admin.

messagestring

Opsional

phonestring

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)

  1. Normalisasi field: string di-trim, amount & startSecond jadi integer.
  2. Concat tanpa pemisah berurutan: preferedName + receiverUserName + amount + mediaShareUrl + startSecond + message + merchantCode + apiKey.
  3. Hash: md5(payload) → 32 karakter hex lowercase.
  4. 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 lowercase
preferedNamestring

Opsional. Nama pengirim di overlay (max 100, di-trim). Kosong = nama akun pemilik key. Tetap ikut MD5.

receiverUserNamestring

Wajib. Username penerima Tipzy (max 20, alpha_dash, case-sensitive, di-trim).

amountnumber

Wajib. Integer IDR (min sesuai setting Tipzy). Di MD5 sebagai String(amount).

mediaShareUrlstring

Opsional. URL mediashare. Kosong = "". Tetap ikut MD5.

startSecondnumber

Opsional. Detik mulai mediashare. Default 0. Di MD5 sebagai String(startSecond).

messagestring

Opsional. Pesan (max 400, di-trim). Kosong = "". Tetap ikut MD5.

merchantCodestring

Wajib. Merchant code API Key (halaman API Keys). Stabil saat regenerate token.

tokenstring

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)

  1. Normalisasi: channelCode → trim + UPPERCASE; nomor rekening / nama / merchantCode → trim; amount → integer.
  2. Concat tanpa pemisah: amount + channelCode + accountNumber + accountHolder + merchantCode + apiKey.
  3. reference dan description tidak masuk MD5.
  4. 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");
amountnumber

Wajib. Nominal ke rekening (min Rp 5.000). Fee cashout dipotong terpisah dari saldo.

channelCodestring

Wajib. Di-normalisasi ke UPPERCASE sebelum MD5 (pakai ID_BCA / ID_MANDIRI / ID_BTN, atau alias bank Tipzy).

accountNumberstring

Wajib. Nomor rekening / e-wallet (di-trim). MD5 memakai nilai setelah trim.

accountHolderstring

Wajib. Nama pemilik (di-trim, max 100). MD5 memakai nilai setelah trim.

merchantCodestring

Wajib. Merchant code API Key.

tokenstring

Wajib. MD5(amount+channelCode+accountNumber+accountHolder+merchantCode+apiKey).

referencestring

Sangat disarankan. Idempotency key per API Key (max 128). Tidak masuk MD5. Request ulang dengan reference sama mengembalikan transaksi yang sama.

descriptionstring

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"