Dokumentasi API
⚡ LAPAK OKKI Reseller API
Dokumentasi REST API resmi LAPAK OKKI untuk integrasi pemesanan otomatis, cek katalog produk, dan deposit saldo dompet 24/7.
📘 Selamat Datang
LAPAK OKKI menyediakan REST API resmi untuk mempermudah integrasi dan otomatisasi transaksi produk digital di toko kami. Anda dapat menghubungkan sistem Anda dengan mudah dari Telegram Bot, website, aplikasi desktop, maupun aplikasi mobile.
🚀 Langkah Mudah Memulai
- Pendaftaran Akun: Daftar atau masuk ke akun LAPAK OKKI Anda (akses API terbuka untuk seluruh pengguna terdaftar).
- Pengisian Saldo Dompet: Isi saldo dompet melalui menu Akun Saya → Dompet Saya (proses otomatis 24/7 via QRIS, E-Wallet, atau Virtual Account).
- Pembuatan API Key: Buka menu Akun Saya → Koneksi API, lalu buat API Key dan API Secret baru.
- Mulai Transaksi API: Kirim HTTP Request ke endpoint API kami. Saldo dompet akan terpotong secara otomatis dan instan saat pembelian berhasil dibuat.
Setiap pembuatan transaksi via REST API (POST /orders) akan memotong Saldo Dompet Reseller Anda secara otomatis. Pastikan saldo Anda mencukupi di menu Akun Saya → Dompet Saya sebelum mengirimkan permintaan pembelian.
🧪 Mode Sandbox & Testing Environment
Mode Sandbox dirancang khusus agar pengembang dan reseller dapat menguji integrasi sistem tanpa risiko finansial atau pengotoran data transaksi riil toko.
- Header HTTP Sandbox: Tambahkan header X-WRC-Sandbox: 1 pada setiap permintaan HTTP Anda.
- Prefiks API Key Sandbox: Penggunaan API Key berawalan wrc_sb_... otomatis mengaktifkan Mode Sandbox tanpa memerlukan header HTTP tambahan.
- Saldo Virtual Instan: Setiap akun secara otomatis memiliki saldo virtual Rp 10.000.000 yang tidak pernah memotong saldo dompet riil Anda.
- Detail Akun / Detail Transaksi Dummy Real-time: Pembelian di sandbox mengembalikan detail akun / detail transaksi dummy (contoh: SB-TEST-LIC-KEY-9988) untuk pengujian parsing JSON.
curl -X POST "https://lapakokki.com/wp-json/reseller/v1/orders" \
-H "X-WRC-API-Key: " \
-H "X-WRC-API-Secret: YOUR_API_SECRET" \
-H "X-WRC-Sandbox: 1" \
-H "Content-Type: application/json" \
-d '{
"items": [{"product_id": 123, "quantity": 1}],
"customer_name": "Tester Sandbox"
}'
🔐 Autentikasi
Setiap permintaan HTTP wajib menyertakan header autentikasi berikut:
X-WRC-API-Key: YOUR_API_KEY
X-WRC-API-Secret: YOUR_API_SECRET
💻 Contoh Implementasi Multi-Bahasa Pemrograman
curl -X GET "https://lapakokki.com/wp-json/reseller/v1/products" \
-H "X-WRC-API-Key: YOUR_API_KEY" \
-H "X-WRC-API-Secret: YOUR_API_SECRET"
const axios = require('axios');
axios.get('https://lapakokki.com/wp-json/reseller/v1/products', {
headers: {
'X-WRC-API-Key': 'YOUR_API_KEY',
'X-WRC-API-Secret': 'YOUR_API_SECRET'
}
}).then(response => console.log(response.data));
$ch = curl_init('https://lapakokki.com/wp-json/reseller/v1/products');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'X-WRC-API-Key: YOUR_API_KEY',
'X-WRC-API-Secret: YOUR_API_SECRET',
]);
$response = curl_exec($ch);
curl_close($ch);
import requests
response = requests.get(
'https://lapakokki.com/wp-json/reseller/v1/products',
headers={
'X-WRC-API-Key': 'YOUR_API_KEY',
'X-WRC-API-Secret': 'YOUR_API_SECRET',
}
)
Selain header kustom, Anda juga dapat menggunakan skema Basic Authentication:
Authorization: Basic base64(API_KEY:API_SECRET)
🛡️ Header Idempotensi (X-Idempotency-Key)
Untuk mencegah eksekusi ganda atau pemotongan saldo berulang saat terjadi gangguan jaringan pada transaksi pembuatan pesanan (POST /orders), Anda disarankan menyertakan header HTTP X-Idempotency-Key (atau parameter idempotency_key).
Jika Anda mengirim ulang permintaan POST /orders dengan X-Idempotency-Key yang sama dalam kurun waktu 24 jam, sistem akan membalas dengan hasil transaksi sebelumnya tanpa memotong saldo dompet Anda untuk kedua kalinya.
📦 Produk
https://lapakokki.com/wp-json/reseller/v1/products
Mengambil daftar produk lengkap beserta harga khusus sesuai dengan tingkatan (tier) akun Anda.
page (halaman), per_page (jumlah per halaman), category (kategori), search (pencarian), in_stock (status stok), orderby (pengurutan), order (arah urutan)
https://lapakokki.com/wp-json/reseller/v1/products/{id}
Mengambil detail lengkap suatu produk, termasuk variasi produk dan ketersediaan stok.
Contoh Respons JSON GET /products (200 OK):
[
{
"id": 123,
"name": "Canva Pro 1 Bulan (Invite)",
"slug": "canva-pro-1-bulan",
"price": "50000",
"regular_price": "60000",
"stock_status": "instock",
"stock_quantity": 45,
"categories": ["Desain", "Aplikasi"],
"is_variable": false,
"variations": []
}
]
🛒 Pembelian
https://lapakokki.com/wp-json/reseller/v1/orders
Membuat pembelian baru secara instan. Saldo dompet dipotong otomatis dan rincian produk (Detail Akun / Detail Transaksi) langsung dikembalikan dalam respons JSON.
curl -X POST "https://lapakokki.com/wp-json/reseller/v1/orders" \
-H "X-WRC-API-Key: YOUR_API_KEY" \
-H "X-WRC-API-Secret: YOUR_API_SECRET" \
-H "Content-Type: application/json" \
-d '{
"items": [
{
"product_id": 123,
"quantity": 1
}
],
"customer_name": "Budi Santoso",
"customer_phone": "081234567890",
"customer_email": "budi@example.com",
"customer_note": "Upgrade Akun: emailpembeli@example.com"
}'
const axios = require('axios');
axios.post('https://lapakokki.com/wp-json/reseller/v1/orders', {
items: [{ product_id: 123, quantity: 1 }],
customer_name: 'Budi Santoso',
customer_phone: '081234567890',
customer_email: 'budi@example.com',
customer_note: 'Upgrade Akun: emailpembeli@example.com'
}, {
headers: {
'X-WRC-API-Key': 'YOUR_API_KEY',
'X-WRC-API-Secret': 'YOUR_API_SECRET',
'Content-Type': 'application/json'
}
}).then(response => console.log(response.data));
$ch = curl_init( 'https://lapakokki.com/wp-json/reseller/v1/orders' );
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
curl_setopt( $ch, CURLOPT_POST, true );
curl_setopt( $ch, CURLOPT_HTTPHEADER, array(
'X-WRC-API-Key: YOUR_API_KEY',
'X-WRC-API-Secret: YOUR_API_SECRET',
'Content-Type: application/json',
) );
curl_setopt( $ch, CURLOPT_POSTFIELDS, json_encode( array(
'items' => array(
array(
'product_id' => 123,
'quantity' => 1,
),
),
'customer_name' => 'Budi Santoso',
'customer_phone' => '081234567890',
'customer_email' => 'budi@example.com',
'customer_note' => 'Upgrade Akun: emailpembeli@example.com',
) ) );
$response = curl_exec( $ch );
curl_close( $ch );
import requests
url = "https://lapakokki.com/wp-json/reseller/v1/orders"
headers = {
"X-WRC-API-Key": "YOUR_API_KEY",
"X-WRC-API-Secret": "YOUR_API_SECRET",
"Content-Type": "application/json"
}
payload = {
"items": [{"product_id": 123, "quantity": 1}],
"customer_name": "Budi Santoso",
"customer_phone": "081234567890",
"customer_email": "budi@example.com",
"customer_note": "Upgrade Akun: emailpembeli@example.com"
}
response = requests.post(url, json=payload, headers=headers)
print(response.json())
Contoh Respons JSON Sukses (200 OK):
{
"success": true,
"order_id": 1048,
"status": "completed",
"total": "50000",
"currency": "IDR",
"items": [
{
"product_id": 123,
"product_name": "Canva Pro 1 Bulan (Invite)",
"quantity": 1,
"price": "50000",
"licenses": [
{
"product_id": 123,
"license_key": "ACCOUNT-LOGIN-OKKI-PASS123"
}
]
}
],
"customer_name": "Budi Santoso",
"customer_note": "Upgrade Akun: emailpembeli@example.com",
"created_at": "2026-09-02 17:30:00"
}
Parameter Body Permintaan (POST /orders):
| Parameter | Tipe Data | Status | Keterangan & Logika Fallback |
|---|---|---|---|
items |
Array | Wajib | Array berisi daftar produk yang dibeli: [{"product_id": 123, "variation_id": 456, "quantity": 1}]. |
customer_name |
String | Dinamis* | Nama Depan pembeli. Jika diwajibkan oleh pengelola toko, parameter ini wajib diisi. Jika opsional & dikosongkan, sistem otomatis menggunakan nama akun Reseller Anda. |
customer_email |
String | Dinamis* | Alamat Email (Untuk Invoice) pembeli. Jika diwajibkan oleh pengelola toko, parameter ini wajib diisi. Jika opsional & dikosongkan, menggunakan email akun Reseller Anda. |
customer_phone |
String | Dinamis* | Nomor Telepon/WhatsApp pembeli. Jika diwajibkan oleh pengelola toko, parameter ini wajib diisi. Jika opsional & dikosongkan, menggunakan nomor telepon akun Reseller Anda. |
customer_note |
String | Dinamis* | Catatan Pembelian. Sangat cocok untuk produk Invite / Upgrade Akun (misalnya berisi list email & password yang akan di-upgrade atau di-invite). Jika diwajibkan oleh pengelola toko, parameter ini wajib diisi. Jika opsional & dikosongkan, sistem membuat catatan otomatis. |
idempotency_key |
String | Opsional | Kunci unik (UUID) pada Header atau Body untuk mencegah pemotongan saldo ganda saat retry. |
* Status Dinamis: Wajib atau Opsional ditentukan oleh pengaturan syarat data pembelian yang dikonfigurasi oleh Pengelola Toko.
https://lapakokki.com/wp-json/reseller/v1/orders
Mengambil riwayat transaksi pemesanan yang telah Anda lakukan melalui API.
page (halaman), per_page (jumlah per halaman), status (filter status: completed, processing, failed, cancelled), orderby, order
X-WP-Total (total transaksi), X-WP-TotalPages (total halaman)
https://lapakokki.com/wp-json/reseller/v1/orders/{id}
Mengambil detail lengkap suatu transaksi pemesanan berdasarkan ID, termasuk rincian produk (Detail Akun / Detail Transaksi).
{
"success": true,
"order": {
"id": 1048,
"status": "completed",
"total": "50000",
"items": [
{
"product_id": 123,
"name": "Canva Pro 1 Bulan (Invite)",
"quantity": 1,
"licenses": [
{
"product_id": 123,
"license_key": "ACCOUNT-LOGIN-OKKI-PASS123"
}
]
}
],
"customer_name": "Budi Santoso",
"created_at": "2026-09-02 17:30:00"
}
}
💰 Dompet & Akun
https://lapakokki.com/wp-json/reseller/v1/wallet/balance
Mengecek sisa saldo dompet akun Reseller Anda saat ini.
{
"success": true,
"balance": 150000,
"formatted": "Rp 150.000",
"currency": "IDR"
}
https://lapakokki.com/wp-json/reseller/v1/wallet/transactions
Mengambil riwayat mutasi masuk dan keluar (kredit/debit) pada saldo dompet Anda.
[
{
"id": 501,
"type": "debit",
"amount": 50000,
"balance_after": 150000,
"description": "Pembayaran Order #1048",
"created_at": "2026-09-02 17:30:00"
},
{
"id": 498,
"type": "credit",
"amount": 200000,
"balance_after": 200000,
"description": "Top Up Saldo via Manual Admin",
"created_at": "2026-09-02 10:00:00"
}
]
https://lapakokki.com/wp-json/reseller/v1/account/stats
Mengambil ringkasan statistik akun Reseller Anda, seperti total pengeluaran dan total akumulasi pemesanan.
{
"success": true,
"stats": {
"total_spent": 2500000,
"total_orders": 42,
"active_keys": 2,
"current_tier": "Tier Reseller VIP"
}
}
🔔 Webhooks & Callback Status
Untuk transaksi bertipe Invite / Upgrade Akun yang membutuhkan pemrosesan manual, sistem kami mendukung pemberitahuan otomatis via Webhook Callback ketika pemesanan diselesaikan oleh Pengelola Toko.
Sistem akan mengirimkan permintaan HTTP POST dengan payload JSON ke URL Callback server Anda saat transaksi bertipe pemrosesan berubah status menjadi Selesai (Completed).
Contoh Payload Webhook Callback Berdasarkan Jenis Event:
{
"event": "order.completed",
"order_id": 1048,
"status": "completed",
"total": "50000",
"customer_name": "Budi Santoso",
"customer_note": "Upgrade Akun: emailpembeli@example.com",
"licenses": [
{
"product_id": 123,
"license_key": "ACCOUNT-LOGIN-OKKI-PASS123"
}
],
"timestamp": 1788332400
}
{
"event": "order.processing",
"order_id": 1049,
"status": "processing",
"total": "75000",
"customer_name": "Siti Rahma",
"customer_note": "Invite Member: siti@example.com",
"licenses": [],
"timestamp": 1788332500
}
{
"event": "order.failed",
"order_id": 1050,
"status": "failed",
"total": "50000",
"refunded": true,
"refund_amount": "50000",
"reason": "Email tujuan tidak dapat di-invite oleh sistem provider",
"timestamp": 1788332600
}
🔑 Verifikasi Keamanan Signature (X-WRC-Signature)
Setiap panggilan Webhook menyertakan header HTTP X-WRC-Signature yang dihitung menggunakan HMAC-SHA256 dari raw payload JSON menggunakan API Secret Anda. Sangat disarankan untuk memverifikasi signature ini demi keamanan server Anda.
$received_sig = $_SERVER['HTTP_X_WRC_SIGNATURE'] ?? '';
$raw_payload = file_get_contents('php://input');
$calculated_sig = hash_hmac('sha256', $raw_payload, 'YOUR_API_SECRET');
if (hash_equals($calculated_sig, $received_sig)) {
// Signature valid & autentik dari server LAPAK OKKI!
$data = json_decode($raw_payload, true);
// Process order.completed
} else {
http_response_code(401);
exit('Invalid Signature');
}
import hmac
import hashlib
from flask import Flask, request, abort
app = Flask(__name__)
@app.route('/webhook', methods=['POST'])
def handle_webhook():
received_sig = request.headers.get('X-WRC-Signature', '')
raw_payload = request.data
calculated_sig = hmac.new('YOUR_API_SECRET'.encode(), raw_payload, hashlib.sha256).hexdigest()
if hmac.compare_digest(calculated_sig, received_sig):
# Signature valid & autentik!
data = request.get_json()
return 'OK', 200
else:
abort(401)
❌ Kode Error
| Status HTTP | Kode Error | Keterangan Kesalahan |
|---|---|---|
| 401 | unauthorized |
Autentikasi gagal. API Key atau API Secret tidak valid atau tidak ditemukan. |
| 401 | key_inactive |
API Key statusnya nonaktif atau telah dicabut oleh Administrator. |
| 403 | forbidden |
Akses ditolak. Pengguna tidak memiliki hak akses atau role yang sesuai. |
| 403 | ip_not_allowed |
Akses ditolak. Alamat IP pengirim tidak terdaftar dalam daftar putih (whitelist). |
| 400 | invalid_request |
Format data JSON yang dikirimkan tidak valid, rusak, atau parameter kurang. |
| 400 | missing_customer_name |
Nama Depan pembeli wajib diisi jika diwajibkan oleh Pengelola Toko. |
| 400 | missing_customer_email |
Alamat Email (Untuk Invoice) pembeli wajib diisi jika diwajibkan oleh Pengelola Toko. |
| 400 | missing_customer_phone |
Nomor Telepon/WhatsApp pembeli wajib diisi jika diwajibkan oleh Pengelola Toko. |
| 400 | missing_customer_note |
Catatan Pembelian wajib diisi jika diwajibkan oleh Pengelola Toko (terutama untuk produk Invite / Upgrade Akun). |
| 402 | insufficient_balance |
Saldo dompet Anda tidak mencukupi untuk menyelesaikan transaksi ini. |
| 404 | not_found |
Produk, variasi produk, atau data transaksi yang diminta tidak ditemukan. |
| 409 | out_of_stock |
Stok produk digital yang diminta sedang habis. |
| 409 | idempotency_conflict |
Kunci idempotency sama dengan transaksi sebelumnya tetapi payload data berbeda. |
| 429 | rate_limit_exceeded |
Batas kecepatan permintaan (rate limit) tercapai. Silakan tunggu beberapa saat. |
| 500 | internal_error |
Terjadi kendala teknis internal pada server. |
⏱️ Batas Penggunaan (Rate Limit)
| Rentang Waktu | Batas Tier Standar | Batas Tier Reseller VIP |
|---|---|---|
| Per Menit | 30 permintaan |
60 permintaan |
| Per Jam | 500 permintaan |
2,000 permintaan |
| Per Hari | 5,000 permintaan |
20,000 permintaan |