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.

🟢 REST API v1 Aktif Format Data: JSON Autentikasi: API Key & Basic Auth

📘 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

  1. Pendaftaran Akun: Daftar atau masuk ke akun LAPAK OKKI Anda (akses API terbuka untuk seluruh pengguna terdaftar).
  2. Pengisian Saldo Dompet: Isi saldo dompet melalui menu Akun Saya → Dompet Saya (proses otomatis 24/7 via QRIS, E-Wallet, atau Virtual Account).
  3. Pembuatan API Key: Buka menu Akun Saya → Koneksi API, lalu buat API Key dan API Secret baru.
  4. Mulai Transaksi API: Kirim HTTP Request ke endpoint API kami. Saldo dompet akan terpotong secara otomatis dan instan saat pembelian berhasil dibuat.
💰
Petunjuk Pembayaran & Deposit Saldo:

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.

🧪
Ketentuan & Fitur Mode Sandbox:
  • 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.
Contoh cURL dengan Header Sandbox
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:

Header Autentikasi Kustom
X-WRC-API-Key: YOUR_API_KEY
X-WRC-API-Secret: YOUR_API_SECRET

💻 Contoh Implementasi Multi-Bahasa Pemrograman

cURL Request
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"
Node.js (Axios)
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));
PHP (cURL)
$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);
Python (Requests)
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:

HTTP Basic Auth
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).

💡
Cara Kerja Idempotensi (Deduplikasi Transaksi):

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

GET https://lapakokki.com/wp-json/reseller/v1/products

Mengambil daftar produk lengkap beserta harga khusus sesuai dengan tingkatan (tier) akun Anda.

Query Parameter: page (halaman), per_page (jumlah per halaman), category (kategori), search (pencarian), in_stock (status stok), orderby (pengurutan), order (arah urutan)
GET 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):

JSON Response (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

POST 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 Command
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"
  }'
Node.js (Axios)
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));
PHP (cURL)
$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 );
Python (Requests)
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):

JSON Response (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.

GET https://lapakokki.com/wp-json/reseller/v1/orders

Mengambil riwayat transaksi pemesanan yang telah Anda lakukan melalui API.

Query Parameter: page (halaman), per_page (jumlah per halaman), status (filter status: completed, processing, failed, cancelled), orderby, order
Header Respons Pagination: X-WP-Total (total transaksi), X-WP-TotalPages (total halaman)
GET https://lapakokki.com/wp-json/reseller/v1/orders/{id}

Mengambil detail lengkap suatu transaksi pemesanan berdasarkan ID, termasuk rincian produk (Detail Akun / Detail Transaksi).

JSON Response (200 OK)
{
  "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

GET https://lapakokki.com/wp-json/reseller/v1/wallet/balance

Mengecek sisa saldo dompet akun Reseller Anda saat ini.

JSON Response (200 OK)
{
  "success": true,
  "balance": 150000,
  "formatted": "Rp 150.000",
  "currency": "IDR"
}
GET https://lapakokki.com/wp-json/reseller/v1/wallet/transactions

Mengambil riwayat mutasi masuk dan keluar (kredit/debit) pada saldo dompet Anda.

JSON Response (200 OK)
[
  {
    "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"
  }
]
GET https://lapakokki.com/wp-json/reseller/v1/account/stats

Mengambil ringkasan statistik akun Reseller Anda, seperti total pengeluaran dan total akumulasi pemesanan.

JSON Response (200 OK)
{
  "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.

📌
Skema Notifikasi Callback:

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:

order.completed (Pesanan Selesai)
{
  "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
}
order.processing (Sedang Diproses)
{
  "event": "order.processing",
  "order_id": 1049,
  "status": "processing",
  "total": "75000",
  "customer_name": "Siti Rahma",
  "customer_note": "Invite Member: siti@example.com",
  "licenses": [],
  "timestamp": 1788332500
}
order.failed (Pesanan Gagal & Saldo Refund)
{
  "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.

PHP Verifikasi Signature
$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');
}
Python Verifikasi 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

❓ Pertanyaan Sering Diajukan (FAQ)

Apakah API Key dapat diperbarui jika bocor?
Bisa. Jika API Key Anda tidak sengaja tersebar, segera buka menu Akun Saya → Koneksi API, lalu hapus kunci lama dan buat API Key yang baru.
Bagaimana cara melakukan pengisian (top-up) saldo dompet?
Buka menu Akun Saya → Dompet Saya → Top Up Saldo. Pengisian saldo beroperasi otomatis 24 jam via QRIS, E-Wallet (OVO, DANA, GoPay, ShopeePay), dan Virtual Account Bank.
Apakah pembelian via API diproses secara otomatis dan instan?
Ya. Selama saldo dompet Anda mencukupi, pembelian langsung diproses secara instan. Untuk produk berupa Detail Akun atau Akun Otomatis, rincian produk/transaksi langsung dikembalikan dalam respons JSON secara real-time. Untuk produk bertipe Invite / Upgrade Akun, pembelian otomatis tercatat dan diproses oleh sistem.
Bagaimana cara kerja Idempotency Key (X-Idempotency-Key)?
Kirimkan header X-Idempotency-Key atau parameter idempotency_key berupa UUID v4 unik pada setiap request POST /orders. Jika terjadi gangguan jaringan dan Anda mengirim ulang request dengan key yang sama dalam 24 jam, sistem akan mengembalikan respons transaksi sebelumnya tanpa memotong saldo dompet Anda dua kali.
Bagaimana cara menaikkan batas Rate Limit ke Tier Reseller VIP?
Jika akun Anda berstatus Tier Standar, Anda dapat mengajukan upgrade status akun ke Pengelola Toko melalui Layanan Pelanggan atau WhatsApp resmi untuk mendapatkan kuota 60 request/menit & harga diskon khusus.
Apa yang terjadi jika saldo dompet saya tidak mencukupi saat melakukan checkout?
Sistem akan menolak transaksi dan mengembalikan status HTTP 402 Payment Required dengan kode error INSUFFICIENT_BALANCE. Pemesanan tidak akan dibuat dan produk tidak akan dikirimkan sampai saldo Anda diisi kembali.