Reseller API
import { Aside, Steps, Tabs, TabItem } from “@astrojs/starlight/components”;
Reseller API Balitech AI memungkinkan partner bisnis (reseller) membuat dan mengelola API key untuk customer mereka secara programmatic — tanpa login ke Console satu per satu.
Pengenalan
Base URL
https://console.balitechsolution.com/api/v1/resellerSemua endpoint di dokumentasi ini relatif terhadap Base URL di atas. Contoh: /auth/login = https://console.balitechsolution.com/api/v1/reseller/auth/login.
Apa itu Reseller API?
Reseller API memungkinkan partner bisnis untuk:
- Membuat API key (
sk-db-...) untuk customer secara otomatis - Mengelola quota dan tracking usage tiap key
- Revoke key dan mendapat refund prorata
- Memonitor semua key yang sudah dibuat
Model Bisnis
Sistem memakai model Prepaid Quota:
- Reseller deposit/topup quota terlebih dahulu
- Setiap pembuatan key memotong quota reseller
- Tidak ada sistem hutang — zero credit risk
- Refund prorata 80% untuk key yang di-revoke sebelum expire
Flow Bisnis
Reseller (Anda) Reseller API Customer (End User) │ │ │ │ 1. Topup quota ──────►│ │ │ │ │ │◄── 2. User order ──────┼────────────────────────────│ │ │ │ │ 3. POST /keys ───────►│ │ │◄── 4. Return API key ──│ │ │ │ │ │ 5. Deliver key ───────┼───────────────────────────►│ │ │◄── 6. Customer pakai API ──│Authentication
Semua request (kecuali register dan login) memerlukan JWT token di header Authorization.
Register
POST /auth/register
Daftar akun reseller baru. Akun dibuat dengan status PENDING dan perlu approval admin.
Request Body
{ "name": "Nama Anda / Perusahaan", "password": "min8karakter", "whatsapp": "08123456789"}Response Success (200)
{ "success": true, "message": "Registration successful. Please wait for admin approval.", "data": { "reseller_id": "res_abc123", "name": "Nama Anda", "status": "PENDING" }}Login
POST /auth/login
Dapatkan JWT token untuk mengakses API.
Request Body
{ "password": "your-password"}Response Success (200)
{ "success": true, "data": { "token": "eyJhbGciOiJIUzI1NiIs...", "expires_at": "2026-09-05T15:00:00Z", "reseller": { "id": "res_abc123", "name": "Your Company", "quota_balance": 5000000000 } }}Menggunakan Token
Setelah login, kirim token di header setiap request:
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...Daftar Paket
Paket berikut tersedia untuk customer Anda:
| Plan | Tokens | Durasi | Daily Limit |
|---|---|---|---|
daily | 20M | 1 hari | 100M |
daily_pro | 40M | 3 hari | 100M |
starter | 200M | 7 hari | 200M |
pro | 250M | 7 hari | 180M |
plus | 400M | 10 hari | 200M |
max | 500M | 10 hari | 250M |
API Endpoints
POST /keys
Buat API key baru untuk customer.
Request Body
{ "customer_name": "John Doe", "plan_type": "starter"}Response Success (201)
{ "success": true, "data": { "key_id": "k_abc123def456", "api_key": "sk-db-aB3xYz7890abcdefghij...", "plan_type": "starter", "tokens": 200000000, "days": 7, "expires_at": "2026-09-14T16:59:59Z" }}GET /keys
List semua key yang sudah dibuat.
Query Parameters
| Parameter | Type | Default | Keterangan |
|---|---|---|---|
status | string | active | active, expired, revoked, all |
limit | int | 50 | Maksimum 200 |
offset | int | 0 | Untuk pagination |
Response Success (200)
{ "success": true, "data": { "keys": [ { "key_id": "k_abc123def456", "api_key_masked": "sk-db-aB3x...stuv", "customer_name": "John Doe", "plan_type": "starter", "status": "ACTIVE", "expires_at": "2026-09-14T16:59:59Z" } ], "total": 1, "limit": 50, "offset": 0 }}GET /keys/{key_id}
Ambil detail key termasuk statistik penggunaan.
Response Success (200)
{ "success": true, "data": { "key": { "id": "k_abc123def456", "api_key_masked": "sk-db-aB3x...stuv", "customer_name": "John Doe", "status": "ACTIVE" }, "usage": { "total_requests": 1523, "tokens_used": 45000000, "tokens_remaining": 155000000 } }}DELETE /keys/{key_id}
Revoke key dan dapatkan refund prorata.
Response Success (200)
{ "success": true, "data": { "key_id": "k_abc123def456", "new_status": "REVOKED", "refund": { "eligible": true, "tokens_refunded": 144000000, "days_used": 1, "days_remaining": 6 } }}POST /keys/{key_id}/topup
Tambah token ke key yang sudah ada. Token ditambahkan tanpa mengubah masa aktif.
Request Body
Nilai tokens dalam juta (contoh 20 = 20M tokens).
{ "tokens": 20}Response Success (200)
{ "success": true, "message": "Successfully added 20M tokens", "data": { "key_id": "k_abc123def456", "customer_name": "John Doe", "tokens_added": 20000000, "tokens_added_formatted": "20M", "new_total_allocated": 220000000 }}Error Codes
| Code | HTTP | Deskripsi |
|---|---|---|
KEY_NOT_FOUND | 404 | Key tidak ditemukan |
KEY_NOT_ACTIVE | 400 | Key tidak aktif (revoked/expired) |
INVALID_TOKENS | 400 | Jumlah token harus positif |
INSUFFICIENT_QUOTA | 402 | Saldo tidak cukup |
GET /quota
Cek sisa quota dan limit akun reseller.
Response Success (200)
{ "success": true, "data": { "balance": 4800000000, "balance_formatted": "4.8B tokens", "limits": { "active_keys_count": 47, "max_active_keys": 100, "keys_created_today": 3 } }}POST /auth/change-password
Ganti password akun reseller.
Request Body
{ "current_password": "old-password", "new_password": "new-secure-password"}Error Handling
Semua error mengikuti format standar:
{ "success": false, "message": "Human readable error", "error_code": "SPECIFIC_ERROR_CODE"}Error Codes
| Error Code | HTTP | Keterangan |
|---|---|---|
INVALID_CREDENTIALS | 401 | Email/password salah |
TOKEN_EXPIRED | 401 | JWT sudah expire, login ulang |
INSUFFICIENT_QUOTA | 402 | Quota tidak cukup, topup dulu |
KEY_NOT_FOUND | 404 | Key tidak ditemukan |
KEY_ALREADY_REVOKED | 400 | Key sudah di-revoke sebelumnya |
Kebijakan Refund
Key yang di-revoke sebelum expire mendapat refund prorata dengan potongan 20%.
Formula
Refund = (Sisa Hari / Total Hari) × Total Tokens × 80%Contoh Perhitungan
| Skenario | Perhitungan | Refund |
|---|---|---|
| Starter, revoke hari ke-0 | (7/7) × 200M × 80% | 160M tokens |
| Starter, revoke hari ke-1 | (6/7) × 200M × 80% | 137M tokens |
| Starter, revoke hari ke-4 | (3/7) × 200M × 80% | 68M tokens |
| Starter, revoke hari ke-7 | (0/7) × 200M × 80% | 0 tokens |
Support
Butuh bantuan? Hubungi kami:
- Email: [email protected]
- Console: https://console.balitechsolution.com
- Status: https://status.balitechsolution.com