Semua ChannelAI GatewayHermesOpenClawAPI Reference3D Mockup APIImage GeneratorVideo GeneratorTutorialChangelogStatus
API Reference

SahabatMobile API Reference

REST API yang kompatibel OpenAI. Base URL untuk semua endpoint di bawah:

https://www.sahabatmobile.com/api/v1

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:

CaraContohKeterangan
Authorization headerBearer sk-...Disarankan
x-api-key headerx-api-key: sk-...Untuk tool yang mengirim header ini (mis. OpenCode)
Query/body?apiKey=sk-...Darurat saja — key bisa bocor di log
401 Invalid API key berarti key salah, dicabut, atau paket langganannya sudah tidak aktif. Buat key baru dan coba lagi.

POST /chat/completions

POST

/api/v1/chat/completions

Endpoint utama. Menerima format OpenAI Chat Completions dan meneruskannya ke provider model yang dipilih. Kredit/kuota terpotong per token aktual.

Parameter

FieldTipeWajibKeterangan
modelstringYaSlug model, mis. google/gemini-2.5-flash. Daftar live via GET /models
messagesarrayYaMinimal 1. Role: system, user, assistant, developer, tool, tool_result
max_tokensintegerTidakDefault 1024, maks 100000
temperaturenumberTidak0–2, default 0.7
streambooleanTidakDefault false. true = SSE chunk (lihat Streaming)
tools, tool_choicearrayTidakHanya model yang mendukung function calling (mis. MiniMax-M3)
reasoning_splitbooleanTidakKhusus 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}
}
Blok <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

/api/v1/models

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.

Semua endpoint 3D memakai margin khusus 25% dan memotong kredit. Bila generasi gagal, kredit otomatis dikembalikan.

GET /3d/models — daftar model

/api/v1/3d/models

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

/api/v1/3d/generate
FieldTipeWajibKeterangan
modelstringYaID model dari GET /3d/models
modestringYatext atau image
promptstringMode textDeskripsi model 3D
imagestringMode imageURL gambar atau base64 (data URI)
texture_imagestringTidakURL/base64 referensi tekstur (model Meshy)
*mixedTidakPengaturan lain mengikuti schema model (mis. geometry_resolution, topology, enable_pbr)
variationsintegerTidakJumlah 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

/api/v1/3d/{task_id}

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

/api/v1/3d/history?limit=20

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

/api/v1/3d/convert

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

EndpointFungsi
POST /api/v1/plugin/checkValidasi key + domain. Body: domain, version?. Balikan status: active | update_required | domain_limit
POST /api/v1/plugin/chatChat via plugin. Body: messages[], model?, domain
GET /api/v1/plugin/updateCek versi plugin terbaru

Error Codes

Semua error berbentuk {"error": {"message": "...", "type": "...", "code": "...?"}}:

Model di luar paket Anda tidak otomatis ditolak. Kalau Anda pelanggan paket dan memanggil model yang tidak termasuk 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).
HTTPType / CodeArtinya & solusi
400invalid_request_errorParameter tidak valid (mis. messages kosong)
400model_no_tool_supportModel tidak mendukung tool calling — pindah ke MiniMax-M3
401invalid_request_errorKey hilang/salah/dicabut/paket tidak aktif — buat key baru
402insufficient_creditsSaldo kredit tidak cukup. Pay-as-you-go dan model di luar paket alike — top-up dulu di dashboard
403model_requires_packageModel mimo-*/minimax-* khusus pelanggan paket
403model_not_billableModel tidak punya harga jual aktif — belum bisa dipanggil. Pilih model lain
429quota_exceeded (5h_exhausted, weekly_exhausted, monthly_exhausted, no_active_package, pace_over)Kuota habis — tunggu reset_in atau upgrade
429rate_limit_exceededMelebihi X request/menit — perlambat + backoff
500server_errorProvider belum dikonfigurasi / gangguan — hubungi support
502provider_errorProvider 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

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.

© 2026 SahabatMobile — PT. BINA SEJAHTERA INOVASI DIGITAL Docs · API · 3D API · Tutorial · Changelog · Status · Komunitas