SahabatMobile API Reference
REST API yang kompatibel OpenAI. Base URL untuk semua endpoint di bawah:
Autentikasi
Sertakan API key di setiap request. Buat key di /ai/api-keys (key personal, awalan sk-) atau /ai/plan-details (key langganan paket, mis. sk-minimax-...). Tiga cara yang didukung:
| Cara | Contoh | Keterangan |
|---|---|---|
Authorization header | Bearer sk-... | Disarankan |
x-api-key header | x-api-key: sk-... | Untuk tool yang mengirim header ini (mis. OpenCode) |
| Query/body | ?apiKey=sk-... | Darurat saja — key bisa bocor di log |
POST /chat/completions
POST
Endpoint utama. Menerima format OpenAI Chat Completions dan meneruskannya ke provider model yang dipilih. Kredit/kuota terpotong per token aktual.
Parameter
| Field | Tipe | Wajib | Keterangan |
|---|---|---|---|
model | string | Ya | Slug model, mis. google/gemini-2.5-flash. Daftar live via GET /models |
messages | array | Ya | Minimal 1. Role: system, user, assistant, developer, tool, tool_result |
max_tokens | integer | Tidak | Default 1024, maks 100000 |
temperature | number | Tidak | 0–2, default 0.7 |
stream | boolean | Tidak | Default false. true = SSE chunk (lihat Streaming) |
tools, tool_choice | array | Tidak | Hanya model yang mendukung function calling (mis. MiniMax-M3) |
reasoning_split | boolean | Tidak | Khusus MiniMax M3 (interleaved thinking) |
Contoh request
curl https://sahabatmobile.com/api/v1/chat/completions \
-H "Authorization: Bearer sk-ISI_KEY_ANDA" \
-H "Content-Type: application/json" \
-d '{
"model": "google/gemini-2.5-flash",
"messages": [
{"role": "system", "content": "Kamu asisten yang ringkas."},
{"role": "user", "content": "Apa itu QRIS?"}
],
"max_tokens": 300,
"temperature": 0.7
}'
Contoh respons sukses (200)
{
"id": "chatcmpl-abc123",
"object": "chat.completion",
"created": 1726000000,
"model": "google/gemini-2.5-flash",
"choices": [{
"index": 0,
"message": {"role": "assistant", "content": "QRIS adalah ..."},
"finish_reason": "stop"
}],
"usage": {"prompt_tokens": 25, "completion_tokens": 40, "total_tokens": 65}
}
<think> pada model reasoning otomatis dibersihkan — content selalu siap tampil.Streaming (SSE)
Kirim "stream": true untuk menerima jawaban kata-per-kata. Format Server-Sent Events:
data: {"id":"chatcmpl-x","object":"chat.completion.chunk","model":"...","choices":[{"index":0,"delta":{"content":"Halo"},"finish_reason":null}]}
data: {"id":"chatcmpl-x","object":"chat.completion.chunk","model":"...","choices":[{"index":0,"delta":{},"finish_reason":"stop"}]}
data: [DONE]
Gabungkan semua choices[0].delta.content hingga data: [DONE]. Contoh lengkap: Tutorial Streaming.
GET /models
GET
Mengembalikan daftar model aktif dalam format OpenAI ({object: "list", data: [{id, object: "model", owned_by, name}]}). Pakai ini agar aplikasi Anda selalu sinkron saat ada model baru — jangan hardcode daftar model.
curl https://sahabatmobile.com/api/v1/models \
-H "Authorization: Bearer sk-ISI_KEY_ANDA"
Endpoint Plugin WordPress
Khusus plugin WordPress resmi (throttle 30–60 req/menit + batas domain & harian per paket):
| Endpoint | Fungsi |
|---|---|
POST /api/v1/plugin/check | Validasi key + domain. Body: domain, version?. Balikan status: active | update_required | domain_limit |
POST /api/v1/plugin/chat | Chat via plugin. Body: messages[], model?, domain |
GET /api/v1/plugin/update | Cek versi plugin terbaru |
Error Codes
Semua error berbentuk {"error": {"message": "...", "type": "...", "code": "...?"}}:
| HTTP | Type / Code | Artinya & solusi |
|---|---|---|
400 | invalid_request_error | Parameter tidak valid (mis. messages kosong) |
400 | model_no_tool_support | Model tidak mendukung tool calling — pindah ke MiniMax-M3 |
401 | invalid_request_error | Key hilang/salah/dicabut/paket tidak aktif — buat key baru |
403 | model_requires_package | Model mimo-*/minimax-* khusus pelanggan paket |
403 | model_not_in_package | Model di luar paket Anda — ganti model atau upgrade paket |
429 | quota_exceeded (5h/weekly/monthly_exhausted) | Kuota habis — tunggu reset_in atau upgrade |
429 | rate_limit_exceeded | Melebihi X request/menit — perlambat + backoff |
500 | server_error | Provider belum dikonfigurasi / gangguan — hubungi support |
502 | provider_error | Provider upstream error — aman untuk retry dengan backoff |
SDK & Contoh Kode
API kompatibel OpenAI — library resmi OpenAI bisa langsung dipakai dengan mengganti base_url.
Python
from openai import OpenAI
client = OpenAI(
base_url="https://sahabatmobile.com/api/v1",
api_key="sk-ISI_KEY_ANDA",
)
resp = client.chat.completions.create(
model="google/gemini-2.5-flash",
messages=[{"role": "user", "content": "Halo!"}],
)
print(resp.choices[0].message.content)
Node.js
import OpenAI from "openai";
const client = new OpenAI({
baseURL: "https://sahabatmobile.com/api/v1",
apiKey: process.env.SM_API_KEY,
});
const c = await client.chat.completions.create({
model: "google/gemini-2.5-flash",
messages: [{ role: "user", content: "Halo!" }],
});
console.log(c.choices[0].message.content);
PHP (Laravel)
$res = Http::withToken(config('services.sm.key'))
->timeout(60)
->post('https://sahabatmobile.com/api/v1/chat/completions', [
'model' => 'google/gemini-2.5-flash',
'messages' => [['role' => 'user', 'content' => 'Halo!']],
]);
echo $res->json('choices.0.message.content');
Panduan langkah-demi-langkah: Tutorial Developer →
Limit & Kuota
- Rate limit: batas request per menit per akun (disesuaikan paket). Terlambat? Respons
429 rate_limit_exceeded. - Kuota paket: jendela 5 jam / mingguan / bulanan tergantung paket. Respons
429menyertakanreset_in. - Model eksklusif: slug
mimo-*danminimax-*hanya untuk pelanggan paket aktif. - Tool calling: hanya model yang mendukung (MiniMax-M3). Mengirim
tool/tool_callske model lain menghasilkan400yang jelas, bukan loop. - Timeout: siapkan timeout client ≥ 60 detik untuk jawaban panjang; pakai
streamuntuk UX lebih baik.
FAQ Developer
Apakah bisa dipakai dengan OpenCode / Cursor / Claude Code?
Ya — set base URL https://sahabatmobile.com/api/v1 dan API key Anda. Panduan per tool ada di dokumentasi utama.
Model apa yang murah untuk development?
Ambil daftar via GET /models dan lihat harga per token. Model flash/lite umumnya paling hemat.
Kenapa 403 padahal key benar?
Kemungkinan besar model eksklusif paket atau di luar paket Anda. Coba model pay-as-you-go seperti google/gemini-2.5-flash, atau cek plan details.
Apakah ada webhook untuk pemakaian?
Belum. Pantau pemakaian via dasbor /ai/usage dan riwayat transaksi.
Butuh bantuan integrasi?
Hubungi WhatsApp support atau lihat paket Bisnis untuk SLA & dedicated support.