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://www.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://www.sahabatmobile.com/api/v1/models \
-H "Authorization: Bearer sk-ISI_KEY_ANDA"
3D Mockup API
Buat model 3D (mockup kemasan/produk) dari teks atau gambar. Alurnya async: kirim tugas → poll status → unduh file.
GET /3d/models — daftar model
Mengembalikan daftar model 3D beserta harga (kredit & rupiah) dan schema pengaturan per model.
curl https://www.sahabatmobile.com/api/v1/3d/models \
-H "Authorization: Bearer sk-ISI_KEY_ANDA"
{
"data": [
{
"id": "meshy/v7.1/text-to-3d",
"label": "Meshy 7.1",
"type": "text-to-3d",
"price_usd": 1.44,
"credits": 64,
"price_idr": 38400,
"credit_value": 600,
"schema": { "...": "pengaturan yang didukung model" }
}
]
}
POST /3d/generate — kirim tugas
| Field | Tipe | Wajib | Keterangan |
|---|---|---|---|
model | string | Ya | ID model dari GET /3d/models |
mode | string | Ya | text atau image |
prompt | string | Mode text | Deskripsi model 3D |
image | string | Mode image | URL gambar atau base64 (data URI) |
texture_image | string | Tidak | URL/base64 referensi tekstur (model Meshy) |
* | mixed | Tidak | Pengaturan lain mengikuti schema model (mis. geometry_resolution, topology, enable_pbr) |
variations | integer | Tidak | Jumlah variasi (1–4). Harga dikalikan jumlah variasi. Default 1 |
curl -X POST https://www.sahabatmobile.com/api/v1/3d/generate \
-H "Authorization: Bearer sk-ISI_KEY_ANDA" \
-H "Content-Type: application/json" \
-d '{
"model": "meshy/v7.1/text-to-3d",
"mode": "text",
"prompt": "Modern elegant packaging pouch for banana chips, gold and cream accents",
"topology": "triangle",
"enable_pbr": true
}'
{
"task_id": "pred_abc123",
"status": "processing",
"credits_used": 64,
"price_idr": 38400,
"poll_url": "https://www.sahabatmobile.com/api/v1/3d/pred_abc123"
}
GET /3d/{task} — status & unduhan
Poll sampai status menjadi completed. Bila gagal, kredit otomatis dikembalikan dan error berisi penjelasan.
{
"task_id": "pred_abc123",
"status": "completed",
"download_url": "https://www.sahabatmobile.com/api/v1/3d/file/ws_3d_1_1234567890.glb",
"format": "glb"
}
GET /3d/history — riwayat
Riwayat generasi milik akun Anda (terbaru lebih dulu).
curl https://www.sahabatmobile.com/api/v1/3d/history \
-H "Authorization: Bearer sk-ISI_KEY_ANDA"
{
"data": [
{
"task_id": "pred_abc123",
"model": "meshy/v7.1/text-to-3d",
"mode": "text",
"status": "completed",
"credits_used": 64,
"created_at": "2026-11-04T03:00:00.000000Z",
"download_url": "https://www.sahabatmobile.com/api/v1/3d/file/ws_3d_1_1234567890.glb"
}
]
}
POST /3d/convert — konversi format
Konversi file GLB milik Anda ke format lain.
curl -X POST https://www.sahabatmobile.com/api/v1/3d/convert \
-H "Authorization: Bearer sk-ISI_KEY_ANDA" \
-H "Content-Type: application/json" \
-d '{"filename":"ws_3d_1_1234567890.glb","format":"obj"}'
Format: glb, gltf, obj, fbx, stl, usdz, 3mf.
Balasan berisi task_id — poll ke POST /3d/convert/query until completed, lalu unduh di download_url.
Webhook
Terima notifikasi otomatis saat generasi atau konversi selesai (pengganti polling).
curl -X POST https://www.sahabatmobile.com/api/v1/webhook \
-H "Authorization: Bearer sk-ISI_KEY_ANDA" \
-H "Content-Type: application/json" \
-d '{"url": "https://server-anda.com/hook"}'
Hapus webhook: DELETE /api/v1/webhook.
Payload yang dikirim:
{
"event": "3d.completed",
"task_id": "pred_abc123",
"status": "completed",
"download_url": "https://www.sahabatmobile.com/api/v1/3d/file/ws_3d_1_1234567890.glb"
}
Contoh Python
import requests, time
BASE = "https://www.sahabatmobile.com/api/v1"
HEADERS = {"Authorization": "Bearer sk-ISI_KEY_ANDA"}
# 1. Kirim tugas
r = requests.post(f"{BASE}/3d/generate", headers=HEADERS, json={
"model": "meshy/v7.1/text-to-3d",
"mode": "text",
"prompt": "Modern elegant packaging pouch for banana chips",
})
task = r.json()["task_id"]
# 2. Poll status
while True:
s = requests.get(f"{BASE}/3d/{task}", headers=HEADERS).json()
if s["status"] in ("completed", "failed"):
break
time.sleep(3)
# 3. Unduh hasil
if s["status"] == "completed":
data = requests.get(s["download_url"], headers=HEADERS).content
open("mockup.glb", "wb").write(data)
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": "...?"}}:
model_config paket Anda, pemanggilannya tetap sah — hanya tagihannya pindah ke
saldo, bukan kuota paket. Kalau saldo kurang, jawabannya 402 insufficient_credits.
Yang benar-benar ditolak 403 hanya dua hal: model eksklusif paket (mimo-*,
minimax-*) saat Anda tidak berlangganan, dan model yang belum punya harga jual
(model_not_billable).
| 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 |
402 | insufficient_credits | Saldo kredit tidak cukup. Pay-as-you-go dan model di luar paket alike — top-up dulu di dashboard |
403 | model_requires_package | Model mimo-*/minimax-* khusus pelanggan paket |
403 | model_not_billable | Model tidak punya harga jual aktif — belum bisa dipanggil. Pilih model lain |
429 | quota_exceeded (5h_exhausted, weekly_exhausted, monthly_exhausted, no_active_package, pace_over) | 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://www.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://www.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://www.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://www.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.