Skip to content

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/reseller

Semua 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",
"email": "[email protected]",
"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",
"email": "[email protected]",
"status": "PENDING"
}
}

Login

POST /auth/login

Dapatkan JWT token untuk mengakses API.

Request Body

{
"email": "[email protected]",
"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:

PlanTokensDurasiDaily Limit
daily20M1 hari100M
daily_pro40M3 hari100M
starter200M7 hari200M
pro250M7 hari180M
plus400M10 hari200M
max500M10 hari250M

API Endpoints

POST /keys

Buat API key baru untuk customer.

Request Body

{
"customer_name": "John Doe",
"customer_email": "[email protected]",
"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

ParameterTypeDefaultKeterangan
statusstringactiveactive, expired, revoked, all
limitint50Maksimum 200
offsetint0Untuk 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

CodeHTTPDeskripsi
KEY_NOT_FOUND404Key tidak ditemukan
KEY_NOT_ACTIVE400Key tidak aktif (revoked/expired)
INVALID_TOKENS400Jumlah token harus positif
INSUFFICIENT_QUOTA402Saldo 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 CodeHTTPKeterangan
INVALID_CREDENTIALS401Email/password salah
TOKEN_EXPIRED401JWT sudah expire, login ulang
INSUFFICIENT_QUOTA402Quota tidak cukup, topup dulu
KEY_NOT_FOUND404Key tidak ditemukan
KEY_ALREADY_REVOKED400Key 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

SkenarioPerhitunganRefund
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: