Semua yang Anda butuhkan untuk terhubung — autentikasi, streaming, rate limit, webhooks, dan referensi endpoint lengkap. Satu base URL, drop-in replacement untuk SDK OpenAI.
Kirim request pertama Anda dalam hitungan menit. Gateway menerima format request OpenAI apa adanya — cukup ganti base URL dan API key.
curl https://ai.cutad.web.id/v1/chat/completions \
-H "Authorization: Bearer ***" \
-H "Content-Type: application/json" \
-d '{
"model": "nama-model-anda",
"messages": [{"role":"user","content":"Halo"}]
}'from openai import OpenAI
client = OpenAI(
base_url="https://ai.cutad.web.id/v1",
api_key="cag_xxxxx",
)
resp = client.chat.completions.create(
model="nama-model-anda",
messages=[{"role":"user","content":"Halo"}],
)
print(resp.choices[0].message.content)Semua request harus menyertakan header Authorization dengan API key Anda.
Authorization: Bearer ***cag_ + 32 karakter base64url.SHA-256 hash di database — kami tidak pernah menyimpan key dalam bentuk asli.Gateway mendukung streaming response dengan Server-Sent Events. Tambahkan stream: true pada request body — gateway otomatis menyertakan token usage di akhir stream.
curl https://ai.cutad.web.id/v1/chat/completions \
-H "Authorization: Bearer ***" \
-H "Content-Type: application/json" \
-d '{
"model": "nama-model-anda",
"messages": [{"role":"user","content":"Halo"}],
"stream": true
}' | head -20stream_options: { include_usage: true } untuk mengirimkan token usage di akhir stream.data: {...} dan diakhiri dengan data: [DONE].Gateway menerapkan dua lapisan proteksi agar penggunaan tetap adil dan terlindung dari penyalahgunaan.
Rate limit in-memory (bukan Redis) — akan reset saat proses restart. Untuk rate limit yang persisten, hubungi admin.
Response header yang dikembalikan:
| Header | Deskripsi |
|---|---|
x-ratelimit-remaining | Sisa request dalam window 60 detik ini |
x-ratelimit-reset | Timestamp (ms) kapan window akan reset |
retry-after | Detik sampai window reset (hanya saat 429) |
Daftar endpoint yang tersedia di gateway, dikelola langsung oleh admin dan selalu up-to-date.
https://ai.cutad.web.id/v1/modelsAPI KeyMengembalikan daftar semua model yang tersedia di gateway.
Sample Response
{
"data": [
{
"id": "nama-model-anda",
"object": "model",
"owned_by": "cutad"
}
],
"object": "list"
}https://ai.cutad.web.id/v1/chat/completionsAPI KeyMembuat completion obrolan format OpenAI-compatible.
Request Body
{
"model": "nama-model-anda",
"messages": [
{
"role": "user",
"content": "Halo"
}
],
"max_tokens": 100
}https://ai.cutad.web.id/v1/embeddingsAPI KeyMenghasilkan embedding vektor untuk teks input.
Request Body
{
"input": "teks contoh",
"model": "nama-model-anda"
}Gateway mendukung sistem kredit berbasis token untuk kontrol biaya yang presisi.
Jika plan Anda mengaktifkan credit (creditAmount > 0), setiap request memotong credit berdasarkan jumlah token yang digunakan (input + output).
creditAmount — jumlah kredit yang diberikan per periode reset.creditResetPeriod — DAILY, WEEKLY, atau MONTHLY. Kredit otomatis reset pada periode berikutnya.creditBalance — sisa kredit yang tersedia.UPDATE ... WHERE creditBalance >= amount untuk mencegah race condition.Saat kredit habis, gateway mengembalikan response 429:
{
"error": {
"message": "Credit exhausted. 100,000 tokens/MONTHLY. Resets 1 Agustus 2026, 00:00.",
"type": "quota_exceeded",
"code": "insufficient_quota",
"param": null,
"credits": {
"remaining": 0,
"limit": 100000,
"resetPeriod": "MONTHLY"
}
}
}Gateway melakukan transformasi model sebelum meneruskan request ke upstream provider — transparan bagi aplikasi Anda.
gpt-4o) diganti dengan upstream model name.systemPromptPrefix dan systemPromptSuffix ditambahkan ke system message.bodyOverridesJson dan paramOverridesJson diterapkan ke request body.headerOverridesJson diterapkan ke upstream request.Terima event real-time setiap kali request API selesai, langsung ke endpoint Anda.
Tambahkan URL webhook di Dashboard → Webhooks. Setiap event dikirim dengan header x-webhook-event dan x-webhook-secret untuk verifikasi.
| Event | Deskripsi |
|---|---|
request.completed | Request API selesai (sukses atau error) |
Setiap webhook dikirim sebagai POST dengan body JSON:
{
"event": "request.completed",
"timestamp": "2026-07-22T10:30:00.000Z",
"data": {
"endpoint": "/v1/chat/completions",
"method": "POST",
"status": 200,
"latencyMs": 150
}
}Headers: x-webhook-event (event type), x-webhook-secret (secret untuk verifikasi). Delivery dicatat di database dengan status SUCCESS/FAILED.
Verifikasi webhook dengan membandingkan header x-webhook-secret dengan secret yang Anda konfigurasi:
import hmac, hashlib, json
def verify_webhook(request, expected_secret):
received = request.headers.get("x-webhook-secret", "")
return hmac.compare_digest(received, expected_secret)
# Usage
if verify_webhook(request, "your-webhook-secret"):
payload = json.loads(request.body)
print(f"Event: {payload['event']}")
print(f"Data: {payload['data']}")Gateway mengembalikan error dalam format OpenAI standar dengan pesan yang jelas untuk setiap kasus.
| Kode | Sub-case | Deskripsi |
|---|---|---|
| 401 | Missing Authorization | Header Authorization tidak ada |
| 401 | Invalid API key | Key tidak ditemukan, tidak aktif, atau sudah direvok |
| 403 | Account suspended | Akun pengguna tidak aktif |
| 403 | No active subscription | Tidak ada langganan yang aktif |
| 429 | Rate limit exceeded | RPM limit terlewati (dengan retry-after header) |
| 429 | Monthly quota exceeded | Total request bulanan terlewati |
| 429 | Credit exhausted | Credit token habis (dengan credits object di response) |
| 404 | Model not found | Model tidak tersedia di gateway |
| 502 | No active provider | Admin belum mengkonfigurasi provider |
| 502 | Upstream error | Error dari upstream (disanitasi, tidak bocorkan konten) |
Gateway menyanitasi error dari upstream untuk mencegah kebocoran konten chat Anda.
Error message dari upstream diganti dengan pesan generik yang aman:
{
"error": {
"message": "Upstream error. Contact support if this persists.",
"type": "upstream_error"
}
}Error sanitization juga berlaku untuk SSE streaming chunks. Stack trace dan request_id dari upstream dihapus.
Gateway mencoba kirim ulang request ke upstream jika terjadi network error.
500ms × (attempt + 1), linear backoff.Butuh bantuan? Tim kami siap membantu integrasi Anda.