PunyaKios Partner API Reference
Dokumentasi resmi PunyaKios Partner API untuk integrasi transaksi digital dan pembayaran online. Terdiri dari 2 modul utama:
1. Host-to-Host (H2H) PPOB
Otomasi transaksi Pulsa, Data, Token PLN, Voucher Game, dan Saldo E-Money dengan saldo deposit Partner dan eksekusi instan.
2. Payment Link & QRIS Dinamis
Terima pembayaran otomatis dari pelanggan Anda melalui QRIS MPM Nasional atau tautan checkout/in-app deeplink.
Base Path API
Gunakan Base Path berikut untuk seluruh pemanggilan endpoint API Partner:
Autentikasi & Header Request
Setiap request yang dikirimkan wajib menyertakan kredensial API Partner melalui HTTP Request Header.
| Header Key | Tipe | Sifat | Deskripsi |
|---|---|---|---|
X-API-KEY |
string |
Wajib | API Key akun partner (contoh: pk_live_xxxxxx). |
X-API-SECRET |
string |
Wajib | API Secret rahasia partner (contoh: ps_live_xxxxxx). |
Content-Type |
string |
Wajib | Harus selalu bernilai application/json. |
Accept |
string |
Wajib | Harus selalu bernilai application/json. |
Cek Saldo & Profil Partner
Mendapatkan profil akun partner, status sandbox, dan sisa saldo deposit aktif secara realtime.
curl -X POST "https://mail.punyakios.id/api/v1/partner/profile" \ -H "Content-Type: application/json" \ -H "X-API-KEY: YOUR_API_KEY" \ -H "X-API-SECRET: YOUR_API_SECRET"
{
"status": "success",
"message": "Profil partner.",
"data": {
"id": 1,
"name": "PT Maju Mandiri H2H",
"email": "partner@example.com",
"phone": "081234567890",
"saldo": 5000000,
"is_sandbox": false,
"webhook_url": "https://server-partner.com/api/webhook",
"created_at": "2026-09-05T02:32:30.000000Z",
"updated_at": "2026-09-05T02:32:30.000000Z"
},
"code": "2000000"
}
Katalog Produk Prabayar
Mengambil daftar produk aktif beserta harga modal H2H khusus Partner.
| Field | Tipe | Sifat | Keterangan |
|---|---|---|---|
type |
string |
Opsional | Tipe produk: prepaid (default) atau pasca. |
category |
string |
Opsional | Filter kategori: pulsa, data, game,
pln, emoney.
|
provider |
string |
Opsional | Filter provider: TELKOMSEL, DANA,
PLN, dll.
|
curl -X POST "https://mail.punyakios.id/api/v1/partner/products" \
-H "Content-Type: application/json" \
-H "X-API-KEY: YOUR_API_KEY" \
-H "X-API-SECRET: YOUR_API_SECRET" \
-d '{
"type": "prepaid",
"category": "pulsa"
}'
{
"status": "success",
"message": "Daftar produk prabayar partner.",
"data": {
"maintenance": false,
"currency": "IDR",
"count": 2,
"products": [
{
"sku": "TD5",
"nama": "Telkomsel 5.000",
"category": "pulsa",
"provider": "TELKOMSEL",
"price": 5550
},
{
"sku": "DANA20",
"nama": "DANA Rp 20.000",
"category": "emoney",
"provider": "DANA",
"price": 20350
}
]
},
"code": "2000000"
}
Order Prabayar (H2H Transaction)
Melakukan eksekusi pembelian produk prabayar secara instan dengan proteksi
idempotency berbasis ref_id.
| Field | Tipe | Sifat | Keterangan |
|---|---|---|---|
ref_id |
string |
Wajib | Nomor referensi unik dari server Anda (max 64 karakter) untuk menjamin idempotency. |
sku |
string |
Wajib | Kode SKU produk (contoh: TD5, DANA20). |
customer_no |
string |
Wajib | Nomor tujuan pengisian (HP / No Meter / ID Akun). |
curl -X POST "https://mail.punyakios.id/api/v1/partner/prepaid/order" \
-H "Content-Type: application/json" \
-H "X-API-KEY: YOUR_API_KEY" \
-H "X-API-SECRET: YOUR_API_SECRET" \
-d '{
"ref_id": "ORDER-TEST-1788576051",
"sku": "TD5",
"customer_no": "081234567890"
}'
{
"status": "success",
"message": "Transaksi diproses.",
"data": {
"ref_id": "ORDER-TEST-1788576051",
"sku": "TD5",
"customer_no": "081234567890",
"status": "success",
"sn": "0905123456789123456",
"amount": 5550,
"message": "Transaksi berhasil."
},
"code": "2000000"
}
Cek Status Transaksi H2H
Memeriksa status mutakhir transaksi H2H menggunakan ref_id.
curl -X POST "https://mail.punyakios.id/api/v1/partner/transaction/status" \
-H "Content-Type: application/json" \
-H "X-API-KEY: YOUR_API_KEY" \
-H "X-API-SECRET: YOUR_API_SECRET" \
-d '{
"ref_id": "ORDER-TEST-1788576051"
}'
{
"status": "success",
"message": "Status transaksi.",
"data": {
"ref_id": "ORDER-TEST-1788576051",
"ref": "ORDER-TEST-1788576051",
"tujuan": "081234567890",
"sku": "TD5",
"produk": "Telkomsel 5.000",
"kategori": "pulsa",
"status": "Success",
"message": "Transaksi berhasil.",
"price": 5550,
"sn": "0905123456789123456",
"created_at": "2026-09-05T09:40:51+07:00"
},
"code": "2000000"
}
Cek Akun Pengguna (Inquiry Nama)
Mengecek keberadaan akun member/pengguna aplikasi PunyaKios dan mendapatkan nama akun yang telah disensor (*masked*) sebelum melakukan transfer saldo.
| Field | Tipe | Sifat | Keterangan |
|---|---|---|---|
phone |
string |
Wajib | Nomor handphone atau email pengguna akun PunyaKios (contoh:
089876543210).
|
{
"phone": "089876543210"
}
curl -X POST "https://mail.punyakios.id/api/v1/partner/user/inquiry" \
-H "Content-Type: application/json" \
-H "X-API-KEY: YOUR_API_KEY" \
-H "X-API-SECRET: YOUR_API_SECRET" \
-d '{
"phone": "089876543210"
}'
{
"status": "success",
"message": "Pengguna PunyaKios ditemukan.",
"data": {
"name": "B*** S***",
"phone": "089876543210"
},
"code": "2000000"
}
Topup Saldo Pengguna (Member PunyaKios)
Mengisi saldo akun pengguna/member aplikasi PunyaKios langsung dari saldo deposit Partner H2H secara instan dan realtime.
| Field | Tipe | Sifat | Keterangan |
|---|---|---|---|
phone |
string |
Wajib | Nomor handphone atau email pengguna akun PunyaKios yang akan ditopup. |
amount |
number |
Wajib | Nominal saldo yang akan ditransfer ke akun pengguna (min: 1.000, max: 10.000.000). |
ref_id |
string |
Wajib | ID referensi unik transaksi dari sistem Partner (idempotent). |
note |
string |
Opsional | Catatan / keterangan transaksi topup. |
curl -X POST "https://mail.punyakios.id/api/v1/partner/topup-user-balance" \
-H "Content-Type: application/json" \
-H "X-API-KEY: YOUR_API_KEY" \
-H "X-API-SECRET: YOUR_API_SECRET" \
-d '{
"phone": "089876543210",
"amount": 50000,
"ref_id": "TOPUP-USER-20260905-001",
"note": "Hadiah Cashback Member"
}'
{
"status": "success",
"message": "Topup saldo pengguna berhasil diproses.",
"data": {
"ref_id": "TOPUP-USER-20260905-001",
"target_user": {
"name": "B*** S***",
"phone": "089876543210"
},
"amount": 50000,
"partner_balance": 4950000,
"status": "success",
"sn": "SN-TOPUP-USER-20260905-001",
"message": "Topup saldo pengguna berhasil.",
"created_at": "2026-09-05T09:47:08.320290Z"
},
"code": "2000000"
}
Topup Saldo Partner (Deposit)
Membuat permohonan pengisian saldo deposit Partner. Mendukung 3 channel pembayaran independen: QRIS Dinamis, Saldo PunyaKios (Bebas Biaya Admin), atau Payment Link Snap UI.
| Field | Tipe | Sifat | Keterangan |
|---|---|---|---|
amount |
number |
Wajib | Nominal deposit yang diinginkan (min: 10.000, max: 50.000.000). |
payment_method |
string |
Opsional | Pilihan channel: qris (default, MDR 0.7%),
punyakios (Bebas Biaya Admin Rp 0 via In-App deeplink), atau
link (Payment Link checkout web Snap style).
|
curl -X POST "https://mail.punyakios.id/api/v1/partner/deposit" \
-H "Content-Type: application/json" \
-H "X-API-KEY: YOUR_API_KEY" \
-H "X-API-SECRET: YOUR_API_SECRET" \
-d '{
"amount": 100000,
"payment_method": "qris"
}'
{
"status": "success",
"message": "Permohonan deposit saldo berhasil dibuat. Silakan scan QRIS untuk menyelesaikan pembayaran.",
"data": {
"external_id": "17885761931337",
"amount": 100000,
"fee_amount": 700,
"total_amount": 100700,
"payment_method": "qris",
"qr_string": "00020101021226590014ID.LINKAJA.WWW011893600914300000000002150000000000000005204581253033605802ID5918Punya Kios Payment6007JAKARTA61051234062070703A0163043B6F",
"status": "pending",
"sandbox": false,
"created_at": "2026-09-17T06:45:00.000000Z"
},
"code": "2000000"
}
{
"status": "success",
"message": "Permohonan deposit via Saldo PunyaKios berhasil dibuat.",
"data": {
"external_id": "17885761931337",
"amount": 100000,
"fee_amount": 0,
"total_amount": 100000,
"payment_method": "app",
"checkout_url": "https://api.punyakios.id/pay/r6Qwe3boW0BEGnXe",
"deeplink": "punyakios.id://pay/r6Qwe3boW0BEGnXe",
"status": "pending",
"sandbox": false,
"created_at": "2026-09-17T06:45:00.000000Z"
},
"code": "2000000"
}
{
"status": "success",
"message": "Permohonan payment link deposit berhasil dibuat.",
"data": {
"external_id": "17885761931337",
"amount": 100000,
"fee_amount": 0,
"total_amount": 100000,
"payment_method": "link",
"checkout_url": "https://api.punyakios.id/pay/r6Qwe3boW0BEGnXe",
"status": "pending",
"sandbox": false,
"created_at": "2026-09-17T06:45:00.000000Z"
},
"code": "2000000"
}
Cek Status Saldo Partner
Mengecek status pembayaran permohonan deposit saldo Partner.
| Field | Tipe | Sifat | Keterangan |
|---|---|---|---|
external_id |
string |
Wajib | ID referensi unik deposit yang didapatkan saat membuat permohonan. |
curl -X POST "https://mail.punyakios.id/api/v1/partner/deposit/status" \
-H "Content-Type: application/json" \
-H "X-API-KEY: YOUR_API_KEY" \
-H "X-API-SECRET: YOUR_API_SECRET" \
-d '{
"external_id": "17885761931337"
}'
{
"status": "success",
"message": "Status deposit partner.",
"data": {
"external_id": "17885761931337",
"amount": 100000,
"status": "paid",
"payment_method": "paprika_qris",
"created_at": "2026-09-05T02:43:13.000000Z",
"updated_at": "2026-09-05T02:44:00.000000Z"
},
"code": "2000000"
}
Terima Pembayaran — QRIS Dinamis (MPM)
Menghasilkan string payload QRIS MPM Dinamis resmi Nasional untuk discan menggunakan GoPay, OVO, DANA, ShopeePay, BCA Mobile, Livin', BRImo, dll.
| Field | Tipe | Sifat | Keterangan |
|---|---|---|---|
external_id |
string |
Wajib | ID referensi invoice unik dari sistem Anda (contoh:
INV-QRIS-002).
|
amount |
number |
Wajib | Nominal pembayaran (min: 1.000, max: 50.000.000). |
description |
string |
Wajib | Keterangan transaksi tagihan (max: 200 karakter). |
payment_method |
string |
Wajib | Isi dengan nilai qris untuk QRIS Dinamis. |
fee_charge_to |
string |
Opsional | user (MDR 0.7% ≤ Rp 100k atau 1.0% > Rp 100k + Rp 200
dibebankan ke pembeli) atau merchant (potong dari saldo Anda).
Default: merchant. |
curl -X POST "https://mail.punyakios.id/api/v1/partner/payment-request" \
-H "Content-Type: application/json" \
-H "X-API-KEY: YOUR_API_KEY" \
-H "X-API-SECRET: YOUR_API_SECRET" \
-d '{
"external_id": "INV-QRIS-002",
"amount": 25000,
"description": "Pembelian Voucher Digital",
"payment_method": "qris",
"fee_charge_to": "user"
}'
{
"status": "success",
"message": "Payment request QRIS dinamis berhasil dibuat",
"data": {
"trx_id": "17885761931337",
"external_id": "INV-QRIS-002",
"amount": 25000,
"base_amount": 25000,
"fee_amount": 375,
"total_amount": 25375,
"payment_method": "qris",
"qris_string": "00020101021226590014ID.LINKAJA.WWW011893600914300000000002150000000000000005204581253033605802ID5918Punya Kios Payment6007JAKARTA61051234062070703A0163043B6F",
"status": "pending",
"expires_at": "2026-09-18T06:45:00.000000Z"
},
"code": "2000000"
}
Terima Pembayaran — Tagihan Aplikasi PunyaKios (In-App)
Membuka pembayaran instan langsung di Aplikasi Punya Kios via deeplink
punyakios.id://pay/{slug}. Bebas Biaya Admin (Rp 0 fee) dan
tanpa QR Code.
| Field | Tipe | Sifat | Keterangan |
|---|---|---|---|
external_id |
string |
Wajib | ID referensi invoice unik dari sistem Anda (contoh:
INV-APP-001).
|
amount |
number |
Wajib | Nominal tagihan (min: 1.000, max: 50.000.000). |
description |
string |
Wajib | Deskripsi pembayaran atau rincian item (max: 200 karakter). |
payment_method |
string |
Wajib | Isi dengan nilai app (atau punyakios) untuk
pembayaran via aplikasi PunyaKios. |
payer_email |
string |
Opsional | Email user terdaftar PunyaKios (otomatis dikirim push notifikasi). |
curl -X POST "https://mail.punyakios.id/api/v1/partner/payment-request" \
-H "Content-Type: application/json" \
-H "X-API-KEY: YOUR_API_KEY" \
-H "X-API-SECRET: YOUR_API_SECRET" \
-d '{
"external_id": "INV-APP-001",
"amount": 50000,
"description": "Pembayaran Tagihan Toko",
"payment_method": "app",
"payer_email": "customer@gmail.com"
}'
{
"status": "success",
"message": "Payment request via Aplikasi PunyaKios berhasil dibuat",
"data": {
"trx_id": "1709260042449",
"external_id": "INV-APP-001",
"amount": 50000,
"fee_amount": 0,
"total_amount": 50000,
"payment_method": "app",
"checkout_url": "https://api.punyakios.id/pay/r6Qwe3boW0BEGnXe",
"deeplink": "punyakios.id://pay/r6Qwe3boW0BEGnXe",
"status": "pending",
"expires_at": "2026-09-18T06:45:00.000000Z"
},
"code": "2000000"
}
Terima Pembayaran — Payment Link (Snap Multi-Channel)
Membuat tautan pembayaran serbaguna dengan antarmuka checkout modern Midtrans Snap style yang menampilkan 2 pilihan pembayaran: QRIS dan Aplikasi PunyaKios.
| Field | Tipe | Sifat | Keterangan |
|---|---|---|---|
external_id |
string |
Wajib | ID referensi invoice unik dari sistem Anda (contoh:
INV-SNAP-003).
|
amount |
number |
Wajib | Nominal tagihan (min: 1.000, max: 50.000.000). |
description |
string |
Wajib | Deskripsi transaksi checkout (max: 200 karakter). |
payment_method |
string |
Wajib | Isi dengan nilai link untuk checkout multi-metode modern Snap
style. |
fee_charge_to |
string |
Opsional | Penanggung biaya jika pelanggan memilih opsi QRIS: merchant
(default) atau user. |
curl -X POST "https://mail.punyakios.id/api/v1/partner/payment-request" \
-H "Content-Type: application/json" \
-H "X-API-KEY: YOUR_API_KEY" \
-H "X-API-SECRET: YOUR_API_SECRET" \
-d '{
"external_id": "INV-SNAP-003",
"amount": 75000,
"description": "Checkout Pesanan Customer",
"payment_method": "link",
"fee_charge_to": "merchant"
}'
{
"status": "success",
"message": "Payment link checkout berhasil dibuat",
"data": {
"trx_id": "17885761931338",
"external_id": "INV-SNAP-003",
"amount": 75000,
"payment_method": "link",
"checkout_url": "https://api.punyakios.id/pay/Sp990xZAb12CdE",
"status": "pending",
"expires_at": "2026-09-18T06:45:00.000000Z"
},
"code": "2000000"
}
Cek Status Pembayaran (Payment Request)
Mengecek status pembayaran invoice Payment Link atau QRIS secara langsung.
curl -X POST "https://mail.punyakios.id/api/v1/partner/check-status" \
-H "Content-Type: application/json" \
-H "X-API-KEY: YOUR_API_KEY" \
-H "X-API-SECRET: YOUR_API_SECRET" \
-d '{
"external_id": "INV-QRIS-002"
}'
{
"status": "success",
"message": "Transaction retrieved successfully",
"data": {
"trx_id": "17885761931337",
"external_id": "INV-QRIS-002",
"slug": "KkSTU0KvEzIDZ3qR",
"amount": 25375,
"status": "paid",
"description": "Pembelian Voucher Digital",
"created_at": "2026-09-05T02:40:51.000000Z",
"paid_at": "2026-09-05T02:41:10.000000Z",
"qris_string": "00020101021226..."
},
"code": "2000000"
}
Webhook Notifikasi Callback
Ketika transaksi PPOB atau pembayaran QRIS/Payment Link berhasil dibayar, PunyaKios otomatis mengirimkan HTTP POST ke URL Webhook Anda.
{
"trx_id": "17885761931337",
"ref_id": "ORDER-TEST-1788575671",
"sku": "TD5",
"customer_no": "081234567890",
"amount": 5550,
"status": "success",
"sn": "0905123456789123456",
"message": "Transaksi berhasil.",
"timestamp": "2026-09-05T09:34:31.000000Z"
}
Validasi Signature Webhook
Validasi integritas callback menggunakan header
X-PunyaKios-Signature (HMAC-SHA256) dengan api_secret Anda:
$rawBody = file_get_contents('php://input');
$data = json_decode($rawBody, true);
$incomingSignature = $_SERVER['HTTP_X_PUNYAKIOS_SIGNATURE'] ?? '';
$stringToSign = ($data['ref_id'] ?? '') . '.' . ($data['status'] ?? '') . '.' . ($data['amount'] ?? '');
$expectedSignature = hash_hmac('sha256', $stringToSign, $yourApiSecret);
if (hash_equals($expectedSignature, $incomingSignature)) {
// Signature VALID - proses update data di server partner
http_response_code(200);
echo json_encode(['status' => 'ok']);
} else {
// Signature INVALID - tolak request
http_response_code(400);
echo json_encode(['status' => 'invalid_signature']);
}
Kode Respon HTTP Standar
Daftar kode respon standar API PunyaKios:
| HTTP Code | Status String | Penjelasan & Tindakan |
|---|---|---|
| 200 OK | success |
Permintaan berhasil dieksekusi atau sedang diproses. |
| 400 Bad Request | TRX_INSUFFICIENT_BALANCE / VALIDATION_FAILED |
Saldo tidak mencukupi atau format parameter request salah. |
| 401 Unauthorized | MERCHANT_API_KEY_INVALID / AUTH_UNAUTHORIZED |
API Key atau API Secret Partner tidak valid / tidak disertakan pada header. |
| 404 Not Found | TRX_NOT_FOUND |
Produk tidak ditemukan atau transaksi tidak ada. |
| 422 Unprocessable Entity | TRX_DUPLICATE |
Nomor ref_id / external_id sudah pernah digunakan. |
| 429 Too Many Requests | RATE_LIMIT_EXCEEDED |
Jumlah request per menit melebihi batas batas rate limit. |
| 503 Service Unavailable | MAINTENANCE |
Layanan atau biller sedang dalam pemeliharaan rutin. |