Navigation
Enterprise API Documentation

Flowix API Reference

Dokumentasi resmi REST API Flowix Technology untuk integrasi layanan PPOB, top up game, deposit otomatis, transaksi digital, dan payout. Disusun agar tim engineering Anda dapat migrasi lebih cepat, memahami alur request dengan jelas, dan mengurangi trial-and-error saat implementasi.

Base URL

REST Endpoint

https://flowix.web.id/api/v1

Payload

JSON Standard

application/json

Integration

Webhook Ready

Contoh request, response, dan callback disiapkan agar proses implementasi lebih mulus.

Coverage

Full Endpoint Set

Deposit, transaksi produk, payout, autentikasi, dan webhook dalam satu dokumentasi terpadu.

Flowix Console
GET /health
POST /deposit
POST /transaction
POST /payout

Migration Notes

Gunakan header api_key dan merchant_id di seluruh request untuk konsistensi dan keamanan integrasi.

Authentication Layer

Autentikasi

Keamanan API kami menggunakan kombinasi API Key (Rahasia) dan Merchant ID (Identitas Bisnis). Kedua parameter ini WAJIB disertakan dalam setiap request.

Anda dapat mengirimkan kredensial ini melalui 3 metode:

  • Header (Rekomendasi - Paling Aman)
  • Body (JSON Payload)
  • Query Parameter (URL)

PENTING: IP Address Anda harus terdaftar di Whitelist (Dashboard API Settings).

curl -X GET "https://flowix.web.id/api/v1/profile" \
-H "Content-Type: application/json" \
-H "api_key: sk-112233-445566-778899" \
-H "merchant_id: MID-FLOWIX123"
GET Production Ready REST Endpoint

Health

Request URL

https://flowix.web.id/api/v1/health
Digunakan untuk memvalidasi konfigurasi autentikasi API Key, Merchant ID, dan IP Whitelist Anda.
curl -X GET 'https://flowix.web.id/api/v1/health' \
-H 'api_key: sk-112233-445566-778899' \
-H 'merchant_id: MID-FLOWIX123' 

Example Response

Contoh payload respons yang diterima integrator setelah request diproses.

200 / 201 OK
{
  "success": true,
  "code": 200,
  "message": "Test successfully.",
  "data": {
    "ip_address": "103.155.xx.xx"
  },
  "meta": {
    "timestamp": "2026-05-21 10:00:00",
    "api_version": "1.0.0",
    "method": "GET",
    "ip": "103.155.xx.xx"
  }
}
GET Production Ready REST Endpoint

Profile

Request URL

https://flowix.web.id/api/v1/profile
Mengambil informasi detail akun, sisa saldo, limit akun, tier, dan konfigurasi integrasi.
curl -X GET 'https://flowix.web.id/api/v1/profile' \
-H 'api_key: sk-112233-445566-778899' \
-H 'merchant_id: MID-FLOWIX123' 

Example Response

Contoh payload respons yang diterima integrator setelah request diproses.

200 / 201 OK
{
  "success": true,
  "code": 200,
  "message": "Successfully retrieved user profile.",
  "data": {
    "merchant_id": "MID-INOVIXA999",
    "username": "Dani Joest",
    "email": "hello@inovixa.web.id",
    "phone": "6285122977536",
    "account": {
      "tier": "Enterprise",
      "status": "active",
      "kyc_status": "verified",
      "is_verified": true,
      "is_2fa_enabled": true
    },
    "financials": {
      "balance": 15500000,
      "balance_limit": 1000000000000
    },
    "integration": {
      "webhook_url": "https://example.com/callback",
      "ip_whitelist": [
        "103.155.xx.xx"
      ]
    },
    "joined_at": "2025-11-04 09:30:00"
  },
  "meta": {
    "timestamp": "2026-04-01 12:01:00",
    "api_version": "1.0.0",
    "method": "GET",
    "ip": "103.155.xx.xx"
  }
}
POST Production Ready REST Endpoint

Update Webhook

Request URL

https://flowix.web.id/api/v1/profile
Memperbarui konfigurasi Webhook URL Anda melalui API.

Parameters

Field yang perlu disiapkan sebelum request dikirim.

Field Type Required Description
action string REQ Aksi yang dilakukan. Value tetap: `update_webhook`
webhook_url string REQ URL callback endpoint Anda. Harus diawali http:// atau https://
curl -X POST 'https://flowix.web.id/api/v1/profile' \
-H 'Content-Type: application/json' \
-H 'api_key: sk-112233-445566-778899' \
-H 'merchant_id: MID-FLOWIX123' \
-d '{
  "action": "update_webhook",
  "webhook_url": "https://example.com/callback"
  
}'

Example Response

Contoh payload respons yang diterima integrator setelah request diproses.

200 / 201 OK
{
  "success": true,
  "code": 200,
  "message": "Webhook URL successfully updated.",
  "data": {
    "new_webhook_url": "https://example.com/callback"
  },
  "meta": {
    "timestamp": "2026-04-01 12:05:00",
    "api_version": "1.0.0",
    "method": "POST",
    "ip": "103.155.xx.xx"
  }
}
GET Production Ready REST Endpoint

Deposit Methods

Request URL

https://flowix.web.id/api/v1/deposit
Mengambil semua metode pembayaran deposit dari gateway aktif. Response tetap menampilkan metode available dan unavailable agar integrator dapat menyusun UI pembayaran yang sinkron dengan pengaturan admin.
curl -X GET 'https://flowix.web.id/api/v1/deposit' \
-H 'api_key: sk-112233-445566-778899' \
-H 'merchant_id: MID-FLOWIX123' 

Example Response

Contoh payload respons yang diterima integrator setelah request diproses.

200 / 201 OK
{
  "success": true,
  "code": 200,
  "message": "Successfully retrieved payment channels.",
  "data": [
    {
      "code": "QRIS",
      "provider_method_code": "QRIS",
      "original_code": "QRIS",
      "name": "QRIS",
      "type": "qris",
      "fee_flat": 750,
      "fee_percent": 0.7,
      "min_amount": 1000,
      "max_amount": 5000000,
      "icon_url": "https://.../qris.png",
      "group": "E-Wallet & QRIS",
      "status": "available",
      "availability_label": "Available",
      "is_available": true,
      "unavailable_reason": null,
      "disabled": false,
      "hidden": false
    },
    {
      "code": "BRIVA",
      "provider_method_code": "BRIVA",
      "original_code": "BRIVA",
      "name": "BRI Virtual Account",
      "type": "va",
      "fee_flat": 4250,
      "fee_percent": 0,
      "min_amount": 10000,
      "max_amount": 10000000,
      "icon_url": "https://.../bri.png",
      "group": "Virtual Account",
      "status": "unavailable",
      "availability_label": "Unavailable",
      "is_available": false,
      "unavailable_reason": "disabled_by_admin",
      "disabled": true,
      "hidden": false
    }
  ],
  "meta": {
    "timestamp": "2026-05-21 10:10:00",
    "api_version": "1.0.0",
    "method": "GET",
    "ip": "103.155.xx.xx"
  }
}
POST Production Ready REST Endpoint

Create Deposit

Request URL

https://flowix.web.id/api/v1/deposit
Membuat invoice deposit saldo. Response mengikuti data backend nyata: QRIS akan mengembalikan qr_image/qr_string, VA atau retail mengembalikan pay_code, dan metode checkout mengembalikan pay_url.

Parameters

Field yang perlu disiapkan sebelum request dikirim.

Field Type Required Description
amount int REQ Nominal saldo yang ingin diterima. Minimal mengikuti method min_amount. Nominal di bawah Rp 1.000 otomatis dipaksa fee_by_customer=true.
method_code string REQ Kode pembayaran (Contoh: QRIS, BCNIVA, BRIVA).
fee_by_customer boolean OPT Jika true, fee ditambahkan ke total tagihan sehingga saldo diterima utuh. Jika false, fee dipotong dari saldo diterima. Untuk nominal < Rp 1.000 sistem tetap memaksa true.
curl -X POST 'https://flowix.web.id/api/v1/deposit' \
-H 'Content-Type: application/json' \
-H 'api_key: sk-112233-445566-778899' \
-H 'merchant_id: MID-FLOWIX123' \
-d '{
  "amount": 100000,
  "method_code": "QRIS",
  "fee_by_customer": true
  
}'

Example Response

Contoh payload respons yang diterima integrator setelah request diproses.

200 / 201 OK
{
  "success": true,
  "code": 201,
  "message": "Deposit created successfully.",
  "data": {
    "reff_id": "DEP-260521-A1B2C3D4E5F6A7B8",
    "pay_id": "T4933632109580REPHV",
    "payment_gateway": "tripay",
    "type": "qris",
    "method_code": "QRIS",
    "provider_method_code": "QRIS",
    "method_name": "QRIS",
    "amount_request": 100000,
    "amount_total": 101458,
    "fee": 1458,
    "amount_received": 100000,
    "fee_by_customer": true,
    "forced_fee_by_customer": false,
    "status": "pending",
    "qr_image": "https://tripay.co.id/qr/T4933632109580REPHV",
    "qr_string": "000201010212266...",
    "pay_url": "https://tripay.co.id/checkout/T4933632109580REPHV",
    "pay_code": null,
    "expired_at": "2026-05-22 10:15:00",
    "paid_at": null,
    "date": "2026-05-21 10:15:00",
    "process_duration_seconds": null,
    "process_duration_text": null,
    "instructions": [
      {
        "title": "Pembayaran via QRIS",
        "steps": [
          "Scan QR Code melalui aplikasi pembayaran Anda.",
          "Pastikan nominal pembayaran sesuai total tagihan.",
          "Selesaikan pembayaran sebelum expired_at."
        ]
      }
    ]
  },
  "meta": {
    "timestamp": "2026-05-21 10:15:00",
    "api_version": "1.0.0",
    "method": "POST",
    "ip": "103.155.xx.xx"
  }
}
GET Production Ready REST Endpoint

Deposit Status

Request URL

https://flowix.web.id/api/v1/deposit/:reff_id
Mengecek status deposit. Jika status masih pending, backend akan mencoba sinkronisasi status terbaru ke provider sebelum mengirim response.
curl -X GET 'https://flowix.web.id/api/v1/deposit/:reff_id' \
-H 'api_key: sk-112233-445566-778899' \
-H 'merchant_id: MID-FLOWIX123' 

Example Response

Contoh payload respons yang diterima integrator setelah request diproses.

200 / 201 OK
{
  "success": true,
  "code": 200,
  "message": "Deposit status retrieved.",
  "data": {
    "reff_id": "DEP-260521-A1B2C3D4E5F6A7B8",
    "pay_id": "T4933632109580REPHV",
    "payment_gateway": "tripay",
    "type": "qris",
    "method_code": "QRIS",
    "provider_method_code": "QRIS",
    "method_name": "QRIS",
    "amount_request": 100000,
    "amount_total": 101458,
    "fee": 1458,
    "amount_received": 100000,
    "fee_by_customer": true,
    "status": "success",
    "qr_image": "https://tripay.co.id/qr/T4933632109580REPHV",
    "qr_string": "000201010212266...",
    "pay_url": "https://tripay.co.id/checkout/T4933632109580REPHV",
    "pay_code": null,
    "expired_at": "2026-05-22 10:15:00",
    "paid_at": "2026-05-21 10:20:00",
    "date": "2026-05-21 10:15:00",
    "process_duration_seconds": 300,
    "process_duration_text": "5 menit"
  },
  "meta": {
    "timestamp": "2026-05-21 10:20:05",
    "api_version": "1.0.0",
    "method": "GET",
    "ip": "103.155.xx.xx"
  }
}
POST Production Ready REST Endpoint

Cancel Deposit

Request URL

https://flowix.web.id/api/v1/deposit/:reff_id/cancel
Membatalkan tiket deposit yang masih berstatus `pending`. Endpoint ini hanya mengubah status deposit di database Flowix menjadi `canceled`.
curl -X POST 'https://flowix.web.id/api/v1/deposit/:reff_id/cancel' \
-H 'Content-Type: application/json' \
-H 'api_key: sk-112233-445566-778899' \
-H 'merchant_id: MID-FLOWIX123' \
-d '{
  
}'

Example Response

Contoh payload respons yang diterima integrator setelah request diproses.

200 / 201 OK
{
  "success": true,
  "code": 200,
  "message": "Deposit canceled successfully.",
  "data": {
    "reff_id": "DEP-260521-A1B2C3D4E5F6A7B8",
    "status": "canceled"
  },
  "meta": {
    "timestamp": "2026-05-21 10:21:00",
    "api_version": "1.0.0",
    "method": "POST",
    "ip": "103.155.xx.xx"
  }
}
GET Production Ready REST Endpoint

List Products

Request URL

https://flowix.web.id/api/v1/product
Mendapatkan daftar produk PPOB beserta harga final sesuai margin akun, informasi supplier publik, status ketersediaan, stok, dan catatan produk.

Parameters

Field yang perlu disiapkan sebelum request dikirim.

Field Type Required Description
category string OPT Filter kategori. Value umum: `all`, `prepaid`, `sosmed`, atau `game` (Default: all).
type string OPT Filter tipe produk khusus dataset Digiflazz. Default: `Semua`.
curl -X GET 'https://flowix.web.id/api/v1/product' \
-H 'api_key: sk-112233-445566-778899' \
-H 'merchant_id: MID-FLOWIX123' 

Example Response

Contoh payload respons yang diterima integrator setelah request diproses.

200 / 201 OK
{
  "success": true,
  "code": 200,
  "message": "Product list retrieved.",
  "data": [
    {
      "code": "ML5",
      "name": "Mobile Legends 5 Diamonds",
      "brand": "Mobile Legends",
      "category": "game",
      "status": "Aktif",
      "raw_status": "active",
      "price": 1500,
      "supplier": "digiflazz",
      "supplier_label": "Digiflazz",
      "public_supplier_label": "Official Supplier",
      "product_type_label": "Game",
      "availability_label": "Aktif",
      "is_available": true,
      "stock": null,
      "note": ""
    },
    {
      "code": "TSEL10",
      "name": "Telkomsel Pulsa 10.000",
      "brand": "Telkomsel",
      "category": "prepaid",
      "status": "Gangguan",
      "raw_status": "inactive",
      "price": 10500,
      "supplier": "vipayment",
      "supplier_label": "VIPayment",
      "public_supplier_label": "Official Supplier",
      "product_type_label": "",
      "availability_label": "Gangguan",
      "is_available": false,
      "stock": 0,
      "note": "Produk sementara tidak tersedia"
    }
  ],
  "meta": {
    "timestamp": "2026-05-21 10:30:00",
    "api_version": "1.0.0",
    "method": "GET",
    "ip": "103.155.xx.xx"
  }
}
POST Production Ready REST Endpoint

Create Transaction

Request URL

https://flowix.web.id/api/v1/product
Membuat transaksi produk PPOB. Saldo dikunci dan dicatat ke mutasi lebih dulu, lalu order diproses ke supplier aktif secara aman. Jika supplier gagal, sistem melakukan refund idempotent.

Parameters

Field yang perlu disiapkan sebelum request dikirim.

Field Type Required Description
service_code string REQ Kode produk dari endpoint List Products.
target string REQ Nomor tujuan / ID Pelanggan / Target URL.
zone string OPT Zone ID (Khusus topup Game tertentu seperti Mobile Legends).
qty int OPT Quantity (Khusus untuk layanan Sosmed).
curl -X POST 'https://flowix.web.id/api/v1/product' \
-H 'Content-Type: application/json' \
-H 'api_key: sk-112233-445566-778899' \
-H 'merchant_id: MID-FLOWIX123' \
-d '{
  "service_code": "ML5",
  "target": "12345678",
  "zone": "1234",
  "qty": 100
  
}'

Example Response

Contoh payload respons yang diterima integrator setelah request diproses.

200 / 201 OK
{
  "success": true,
  "code": 201,
  "message": "Order received and is being processed.",
  "data": {
    "reff_id": "TRX-20260521103500-F5A9",
    "status": "processing",
    "sn": "",
    "price": 1500,
    "balance_left": 15498500
  },
  "meta": {
    "timestamp": "2026-05-21 10:35:00",
    "api_version": "1.0.0",
    "method": "POST",
    "ip": "103.155.xx.xx"
  }
}
GET Production Ready REST Endpoint

Transaction Status

Request URL

https://flowix.web.id/api/v1/product/:reff_id
Mengecek status riwayat pembelian/transaksi PPOB. Ganti `:reff_id` dengan kode reff_id transaksi.
curl -X GET 'https://flowix.web.id/api/v1/product/:reff_id' \
-H 'api_key: sk-112233-445566-778899' \
-H 'merchant_id: MID-FLOWIX123' 

Example Response

Contoh payload respons yang diterima integrator setelah request diproses.

200 / 201 OK
{
  "success": true,
  "code": 200,
  "message": "Transaction status retrieved.",
  "data": {
    "reff_id": "TRX-20260521103500-F5A9",
    "service_code": "ML5",
    "service_name": "Mobile Legends 5 Diamonds",
    "target": "12345678 (1234)",
    "selling_price": 1500,
    "status": "success",
    "sn": "136216325",
    "note": "Transaction completed successfully.",
    "createdAt": "2026-05-21T03:35:00.000Z",
    "process_duration_seconds": 42,
    "process_duration_text": "42 detik"
  },
  "meta": {
    "timestamp": "2026-05-21 10:36:00",
    "api_version": "1.0.0",
    "method": "GET",
    "ip": "103.155.xx.xx"
  }
}
POST Production Ready REST Endpoint

Check Game ID

Request URL

https://flowix.web.id/api/v1/game/check-id
Melakukan pengecekan validitas User ID / Zone ID Game sebelum melakukan top up. Ini sangat penting untuk mencegah transaksi gagal akibat target ID yang salah.

Daftar Game Code yang Tersedia:
  • mobile-legends (MLBB) - Butuh target (User ID) & additional_target (Zone ID)
  • mobile-legends-region (MLBB Region) - Butuh target & additional_target *Min. Saldo Rp 100.000
  • free-fire (FF/MAX) - Butuh target (User ID)
  • pubgm (PUBG Mobile) - Butuh target (User ID)
  • valorant - Butuh target (User ID)
  • genshin-impact - Butuh target (User ID) & additional_target (Server)
  • honkai-star-rail - Butuh target (User ID) & additional_target (Server)
  • pointblank - Butuh target (User ID)

*List game yang tersedia sewaktu-waktu dapat diupdate.

Parameters

Field yang perlu disiapkan sebelum request dikirim.

Field Type Required Description
code string REQ Kode produk game dari list di atas.
target string REQ ID atau Nomor target pelanggan (User ID).
additional_target string OPT Zone ID / Server ID (khusus game tertentu seperti MLBB).
curl -X POST 'https://flowix.web.id/api/v1/game/check-id' \
-H 'Content-Type: application/json' \
-H 'api_key: sk-112233-445566-778899' \
-H 'merchant_id: MID-FLOWIX123' \
-d '{
  "code": "mobile-legends",
  "target": "12345678",
  "additional_target": "1234"
  
}'

Example Response

Contoh payload respons yang diterima integrator setelah request diproses.

200 / 201 OK
{
  "success": true,
  "code": 200,
  "message": "Success",
  "data": {
    "player_name": "DaniJoest",
    "request_details": {
      "code": "mobile-legends",
      "target": "12345678",
      "additional_target": "1234"
    }
  },
  "meta": {
    "timestamp": "2026-04-07 15:30:00",
    "api_version": "1.0.0",
    "method": "POST",
    "ip": "103.155.xx.xx"
  }
}
POST Production Ready REST Endpoint

Create Payout

Request URL

https://flowix.web.id/api/v1/payout
Mengirim permintaan penarikan dana (Payout) ke rekening Bank atau E-Wallet.

Parameters

Field yang perlu disiapkan sebelum request dikirim.

Field Type Required Description
amount int REQ Nominal pencairan dana.
bank_code string REQ Kode bank (contoh: BCA, BRI, DANA).
account_number string REQ Nomor rekening tujuan.
account_name string OPT Nama pemilik rekening untuk data referensi.
curl -X POST 'https://flowix.web.id/api/v1/payout' \
-H 'Content-Type: application/json' \
-H 'api_key: sk-112233-445566-778899' \
-H 'merchant_id: MID-FLOWIX123' \
-d '{
  "amount": 50000,
  "bank_code": "BCA",
  "account_number": "85122977536",
  "account_name": "Dani Joest"
  
}'

Example Response

Contoh payload respons yang diterima integrator setelah request diproses.

200 / 201 OK
{
  "success": true,
  "code": 201,
  "message": "Payout request submitted for review.",
  "data": {
    "reff_id": "WD-1709423500-CDE",
    "amount": 50000,
    "fee": 5000,
    "total_deducted": 55000,
    "status": "pending",
    "balance_left": 15443500
  },
  "meta": {
    "timestamp": "2026-04-01 12:40:00",
    "api_version": "1.0.0",
    "method": "POST",
    "ip": "103.155.xx.xx"
  }
}
GET Production Ready REST Endpoint

Payout Status

Request URL

https://flowix.web.id/api/v1/payout/:reff_id
Mengecek status penarikan dana (Payout). Ganti `:reff_id` dengan kode reff_id payout.
curl -X GET 'https://flowix.web.id/api/v1/payout/:reff_id' \
-H 'api_key: sk-112233-445566-778899' \
-H 'merchant_id: MID-FLOWIX123' 

Example Response

Contoh payload respons yang diterima integrator setelah request diproses.

200 / 201 OK
{
  "success": true,
  "code": 200,
  "message": "Payout status retrieved.",
  "data": {
    "reff_id": "WD-1709423500-CDE",
    "bank_code": "BCA",
    "account_number": "85122977536",
    "amount": 50000,
    "fee": 5000,
    "status": "success",
    "note": "Penarikan disetujui dan telah ditransfer ke rekening tujuan.",
    "sn": "MAN-1709428500",
    "createdAt": "2026-04-01T05:40:00.000Z"
  },
  "meta": {
    "timestamp": "2026-04-01 12:45:00",
    "api_version": "1.0.0",
    "method": "GET",
    "ip": "103.155.xx.xx"
  }
}

Webhook Integration (Callbacks)

Flowix akan mengirimkan request HTTP POST ke Webhook URL Anda setiap kali terjadi perubahan status pada deposit, transaksi produk, atau payout. Integrasi ini direkomendasikan agar sistem Anda menerima update secara real-time tanpa perlu melakukan polling terus-menerus.

Penting untuk Integrasi

Webhook dikirim ketika status data di sistem Flowix berubah. Pastikan endpoint Anda dapat menerima JSON, memverifikasi signature, memproses event berdasarkan event dan data.status, lalu membalas HTTP 200 OK secepat mungkin.

1. Alur Integrasi yang Direkomendasikan

  1. Siapkan endpoint publik Anda, misalnya https://domainanda.com/webhook/flowix.
  2. Simpan Webhook URL dan Webhook Secret pada pengaturan akun / API Settings.
  3. Terima request POST dengan body JSON dari Flowix.
  4. Verifikasi header X-Flowix-Signature menggunakan HMAC-SHA256 dengan raw request body dan Webhook Secret Anda.
  5. Baca nilai event untuk menentukan jenis callback, misalnya deposit.status, transaction.status, atau payout.status.
  6. Baca nilai data.status untuk menentukan status akhir, misalnya success, failed, expired, atau canceled.
  7. Setelah data berhasil diproses di sistem Anda, balas dengan HTTP 200 agar callback tidak dianggap gagal.

2. Webhook Headers

Header NameDescription
Content-Type Selalu bernilai application/json.
User-Agent Identifier pengirim, contoh: Flowix-Webhook-System/1.0.
X-Flowix-Signature Signature HMAC-SHA256 hex digest dari raw body menggunakan Webhook Secret Anda.
X-Flowix-Key API Key milik akun Anda. Dapat digunakan sebagai verifikasi tambahan.
X-Flowix-Merchant Merchant ID milik akun Anda. Dapat digunakan sebagai verifikasi tambahan.
X-Flowix-Event Jenis event callback, misalnya deposit.status, transaction.status, atau payout.status.

3. Struktur Umum Payload

{
  "id": "evt_550e8400-e29b-41d4-a716-446655440000",
  "event": "transaction.status",
  "timestamp": 1776628205,
  "data": {
    "reff_id": "TRX-20260419153000-A1B2",
    "status": "success"
  }
}

Field Utama

  • id : ID event webhook unik.
  • event : Jenis callback.
  • timestamp : UNIX timestamp saat event dibuat.
  • data : Detail payload sesuai tipe event.

Status yang Umum Digunakan

  • success : Proses berhasil.
  • failed : Proses gagal.
  • expired : Umum pada deposit yang melewati batas waktu pembayaran.
  • canceled : Dibatalkan oleh sistem atau pengguna.

4. Contoh Payload Webhook Deposit

Event: deposit.status. Callback ini digunakan untuk sinkronisasi status deposit saldo.

Deposit Success
{
  "id": "evt_f8a4928f-54ff-4f53-92d6-1b7b9a4d0001",
  "event": "deposit.status",
  "timestamp": 1776628205,
  "data": {
    "reff_id": "DEP-260419-AB12CD",
    "status": "success",
    "amount": 10000,
    "original_amount": 10750,
    "provider_ref": "T1234567890ABCDE",
    "note": "Deposit berhasil dibayar."
  }
}
Deposit Failed / Expired / Canceled
{
  "id": "evt_f8a4928f-54ff-4f53-92d6-1b7b9a4d0002",
  "event": "deposit.status",
  "timestamp": 1776628340,
  "data": {
    "reff_id": "DEP-260419-AB12CD",
    "status": "failed",
    "amount": 10750,
    "provider_ref": "T1234567890ABCDE",
    "note": "Deposit gagal diproses."
  }
}

Catatan Deposit

Pada status success, field amount merepresentasikan nominal saldo yang diterima. Field original_amount merepresentasikan total tagihan deposit sebelum atau saat diproses provider.

5. Contoh Payload Webhook Transaksi Produk

Event: transaction.status. Callback ini digunakan untuk update status transaksi produk seperti pulsa, data, game, e-wallet, dan layanan digital lainnya.

Transaction Success
{
  "id": "evt_2af0134e-9cb4-49f1-a919-7f4b2fd30001",
  "event": "transaction.status",
  "timestamp": 1776628501,
  "data": {
    "reff_id": "TRX-20260419154000-F5A9",
    "product": "ML5",
    "target": "12345678 (1234)",
    "status": "success",
    "sn": "136216325",
    "note": "Transaksi Berhasil"
  }
}
Transaction Failed
{
  "id": "evt_2af0134e-9cb4-49f1-a919-7f4b2fd30002",
  "event": "transaction.status",
  "timestamp": 1776628599,
  "data": {
    "reff_id": "TRX-20260419154000-F5A9",
    "product": "ML5",
    "target": "12345678 (1234)",
    "status": "failed",
    "sn": "GAGAL",
    "note": "Transaksi Gagal dari Provider"
  }
}

6. Contoh Payload Webhook Payout

Event: payout.status. Callback ini digunakan untuk sinkronisasi status penarikan dana.

Payout Success
{
  "id": "evt_41fd2dcb-221f-4f3b-a90a-42ff3b440001",
  "event": "payout.status",
  "timestamp": 1776628800,
  "data": {
    "reff_id": "PO-260419-ZZ77AA",
    "status": "success",
    "amount": 50000,
    "sn": "TRF-20260419-998877",
    "note": "Transfer berhasil diproses."
  }
}
Payout Failed / Canceled
{
  "id": "evt_41fd2dcb-221f-4f3b-a90a-42ff3b440002",
  "event": "payout.status",
  "timestamp": 1776628895,
  "data": {
    "reff_id": "PO-260419-ZZ77AA",
    "status": "failed",
    "amount": 50000,
    "note": "Transfer gagal diproses oleh provider."
  }
}

7. Contoh Handler Berdasarkan Event

Node.js (Express)
flowix-handler.js
app.post('/webhook/flowix', express.json({
  verify: (req, res, buf) => {
    req.rawBody = buf.toString();
  }
}), (req, res) => {
  const crypto = require('crypto');
  const secret = 'whsec_YOUR_SECRET';
  const signature = req.headers['x-flowix-signature'];

  const expectedSignature = crypto
    .createHmac('sha256', secret)
    .update(req.rawBody)
    .digest('hex');

  if (signature !== expectedSignature) {
    return res.status(403).json({ error: 'Invalid Signature' });
  }

  const { event, data } = req.body;

  if (event === 'deposit.status') {
    if (data.status === 'success') {
      // tandai deposit sukses
    } else if (data.status === 'failed' || data.status === 'expired' || data.status === 'canceled') {
      // tandai deposit gagal / expired / canceled
    }
  }

  if (event === 'transaction.status') {
    if (data.status === 'success') {
      // tandai transaksi sukses, simpan SN jika ada
    } else if (data.status === 'failed') {
      // tandai transaksi gagal
    }
  }

  if (event === 'payout.status') {
    if (data.status === 'success') {
      // tandai payout sukses
    } else if (data.status === 'failed' || data.status === 'canceled') {
      // tandai payout gagal / canceled
    }
  }

  return res.status(200).json({ received: true });
});

8. Verifying Signature (Minimal Example)

Node.js (Express)
express-webhook.js
const crypto = require('crypto');
const express = require('express');
const app = express();

app.post('/webhook/flowix', express.json({
    verify: (req, res, buf) => {
        req.rawBody = buf.toString();
    }
}), (req, res) => {
    const secret = 'whsec_YOUR_SECRET';
    const signature = req.headers['x-flowix-signature'];
    const payload = req.rawBody;

    const expectedSignature = crypto
        .createHmac('sha256', secret)
        .update(payload)
        .digest('hex');

    if (signature !== expectedSignature) {
        return res.status(403).json({ error: 'Invalid Signature' });
    }

    const { event, data } = req.body;
    console.log(`Received event: ${event}`, data);

    res.status(200).json({ received: true });
});