Dokumentasi API

Model yang tersedia saat ini dan cara memanggil AI Gateway.

Model tersedia

Tarif dihitung dari harga provider asli, dikonversi ke IDR pakai kurs efektif harian (lihat /v1/me/usage untuk biaya aktual per request). Kalau tenant memakai kunci provider sendiri (BYOK), tidak ada biaya lewat saldo gateway.

GET /v1/models mengembalikan daftar ini sebagai JSON — publik, tidak butuh API key. Cocok dipanggil sebelum mengirim request untuk validasi model ID atau menampilkan pilihan model di UI Anda sendiri.

Model teks dipakai bersama oleh ketiga endpoint percakapan — /v1/chat/completions, /v1/messages, dan /v1/responses. Tidak ada daftar terpisah per protokol: memilih endpoint menentukan format request/response, bukan provider mana yang dipakai. Model lintas-provider umumnya bisa dipanggil dari protokol mana pun — misalnya gpt-5 lewat format Anthropic di /v1/messages.

Model embedding (text-embedding-3-small) adalah pengecualian: hanya bisa dipakai lewat /v1/embeddings, dan sebaliknya endpoint itu tidak menerima model percakapan. Keduanya menghasilkan hal yang berbeda — embedding mengembalikan vektor angka, bukan teks.

Pengecualian yang diketahui: model Qwen (qwen-*) belum bisa dipakai lewat /v1/responses — lapisan penerjemah di hulu mengirim tools kosong yang ditolak DashScope. Model Qwen tetap normal lewat /v1/chat/completions dan /v1/messages. Kalau ragu, cek dengan satu request kecil sebelum dipakai di produksi.

Contoh request

curl https://ai.awansiber.co.id/v1/models

Contoh response

{
  "object": "list",
  "data": [
    {
      "object": "model",
      "id": "gpt-5",
      "name": "GPT 5",
      "provider": "openai",
      "owned_by": "combo",
      "context_limit": 1000000,
      "default": false,
      "created": 0,
      "hostCountry": "US",
      "inputPerMtokUsd": "1.25",
      "outputPerMtokUsd": "10",
      "effectiveFrom": "2026-08-01",
      "maxTokens": null
    },
    ...
  ]
}

context_limit adalah ukuran context window model, default menandai model dasar gateway, dan maxTokens adalah budget output default (null = pakai fallback endpoint). Field harga lama (hostCountry, inputPerMtokUsd, outputPerMtokUsd, effectiveFrom) tetap dikirim untuk kompatibilitas.

Daftar model saat ini

Memuat daftar model...

Autentikasi

Semua request ke /v1/chat/completions butuh API key tenant di header Authorization. Buat API key dari dashboard (/dashboard/) setelah login — key hanya ditampilkan sekali saat dibuat.

Authorization: Bearer sk-awn-xxxxxxxxxxxxxxxxxxxxxxxx

Chat completion

POST /v1/chat/completions — default merespons sebagai stream SSE (text/event-stream). Kirim "stream": false di body kalau klien Anda (mis. Postman, atau bahasa tanpa dukungan SSE mudah) butuh satu balasan JSON biasa.

Body request

FieldTipeKeterangan
modelstringSalah satu Model ID di tabel atas.
messagesarray[{"role": "user", "content": "..."}, ...] — role: user / assistant / system.
max_completion_tokens / max_tokensnumberOpsional. Gunakan max_completion_tokens untuk klien OpenAI terbaru; max_tokens tetap didukung. Default 512 atau default khusus model.
streambooleanOpsional, default true. Set false untuk respons JSON tunggal (bukan SSE).
toolsarrayOpsional. Daftar tool/function definition gaya OpenAI, diteruskan apa adanya ke provider. Lihat dokumentasi tool calling OpenAI untuk format.
tool_choicestring / objectOpsional. "auto", "none", atau paksa satu tool tertentu — sama seperti spesifikasi OpenAI.

Contoh request (stream, default)

curl -N -X POST https://ai.awansiber.co.id/v1/chat/completions \
  -H "Authorization: Bearer sk-awn-xxxxxxxxxxxxxxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gpt-5",
    "messages": [{"role": "user", "content": "Halo, apa kabar?"}],
    "max_completion_tokens": 200
  }'

Contoh response (stream)

data: {"id":"chatcmpl-...","choices":[{"index":0,"delta":{"role":"assistant","content":""}}]}

data: {"id":"chatcmpl-...","choices":[{"index":0,"delta":{"content":"Halo"}}]}

data: {"id":"chatcmpl-...","choices":[{"index":0,"delta":{},"finish_reason":"stop"}],"usage":{"completion_tokens":12,"prompt_tokens":8,"total_tokens":20}}

data: [DONE]

Parse tiap baris data: ... seperti event SSE OpenAI-compatible standar, dan hentikan saat menerima data: [DONE].

Contoh request (non-stream)

curl -X POST https://ai.awansiber.co.id/v1/chat/completions \
  -H "Authorization: Bearer sk-awn-xxxxxxxxxxxxxxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gpt-5",
    "messages": [{"role": "user", "content": "Halo, apa kabar?"}],
    "max_completion_tokens": 200,
    "stream": false
  }'

Contoh response (non-stream)

{
  "id": "f6c1...",
  "object": "chat.completion",
  "model": "gpt-5",
  "choices": [
    {
      "index": 0,
      "message": { "role": "assistant", "content": "Halo! Kabar baik, ada yang bisa dibantu?" },
      "finish_reason": "stop"
    }
  ],
  "usage": { "prompt_tokens": 8, "completion_tokens": 14, "total_tokens": 22 }
}

Header opsional

HeaderKeterangan
x-data-classKlasifikasi sensitivitas data request ini (mis. public, internal, confidential) — dievaluasi terhadap kebijakan routing tenant. Default ikut setting API key.

Messages (Anthropic-native)

POST /v1/messages — bicara format Anthropic Messages API native (bukan OpenAI Chat Completions). Dipakai buat klien yang sudah terintegrasi Anthropic langsung, misal Claude Code (set ANTHROPIC_BASE_URL ke gateway ini, ANTHROPIC_API_KEY ke API key tenant Anda).

Autentikasi

Header x-api-key (bukan Authorization: Bearer), sesuai konvensi Anthropic:

x-api-key: sk-awn-xxxxxxxxxxxxxxxxxxxxxxxx

Body request

FieldTipeKeterangan
modelstringSalah satu Model ID di tabel atas.
max_tokensnumberWajib (beda dari /v1/chat/completions yang opsional).
messagesarrayFormat Anthropic — content boleh string atau array content block (text/tool_use/tool_result).
systemstring / arrayOpsional, system prompt terpisah dari messages. Ikut dipindai dan diredaksi PII sama seperti isi messages.
toolsarrayOpsional, format tool Anthropic (name/description/input_schema).
streambooleanOpsional, default false (beda dari /v1/chat/completions yang default true).

Contoh request

curl -X POST https://ai.awansiber.co.id/v1/messages \
  -H "x-api-key: sk-awn-xxxxxxxxxxxxxxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "claude-sonnet-5",
    "max_tokens": 200,
    "messages": [{"role": "user", "content": "Halo, apa kabar?"}]
  }'

Contoh response

{
  "id": "msg_...",
  "type": "message",
  "role": "assistant",
  "model": "claude-sonnet-5",
  "content": [{ "type": "text", "text": "Halo! Kabar baik, ada yang bisa dibantu?" }],
  "stop_reason": "end_turn",
  "usage": { "input_tokens": 8, "output_tokens": 14 }
}

Catatan cakupan saat ini: pemindaian dan redaksi PII mencakup isi messages dan system — PII di system prompt diperlakukan sama, tidak lolos begitu saja. Keduanya berbagi satu penomoran placeholder ([NIK_1], [NIK_2], …) supaya nilai asli tetap bisa dipulihkan tanpa ambigu. Redaksi diterapkan ke request yang dikirim ke provider, sama seperti /v1/chat/completions; redaksi pada response yang diterima balik dari provider belum diimplementasikan di kedua endpoint.

Responses (OpenAI Responses API)

POST /v1/responses — bicara format OpenAI Responses API, alternatif yang lebih baru dari Chat Completions. Dipakai buat klien atau SDK yang sudah memakai client.responses.create(...); cukup arahkan base URL SDK ke gateway ini.

Autentikasi

Header Authorization: Bearer, sama seperti /v1/chat/completions:

Authorization: Bearer sk-awn-xxxxxxxxxxxxxxxxxxxxxxxx

Body request

FieldTipeKeterangan
modelstringWajib. Salah satu Model ID di tabel atas.
inputstring / arrayWajib. Boleh string biasa, atau array item (mis. [{"role": "user", "content": "..."}]; content juga boleh array part input_text/input_image, plus item function_call/function_call_output).
instructionsstringOpsional, instruksi sistem terpisah dari input. Ikut dipindai dan diredaksi PII sama seperti isi input.
streambooleanOpsional, default false. Set true untuk SSE event Responses API (response.output_text.delta, ditutup response.completed lalu data: [DONE]).
toolsarrayOpsional, format tool Responses API, diteruskan apa adanya ke provider.
tool_choicestring / objectOpsional. "auto", "none", atau paksa satu tool tertentu — sama seperti spesifikasi OpenAI.
max_output_tokensnumberOpsional, default 512.

Contoh request (non-stream)

curl -X POST https://ai.awansiber.co.id/v1/responses \
  -H "Authorization: Bearer sk-awn-xxxxxxxxxxxxxxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gpt-5",
    "input": "Halo, apa kabar?",
    "max_output_tokens": 200
  }'

Contoh response (non-stream)

{
  "id": "resp_...",
  "object": "response",
  "model": "gpt-5",
  "output": [
    {
      "type": "message",
      "role": "assistant",
      "content": [{ "type": "output_text", "text": "Halo! Kabar baik, ada yang bisa dibantu?" }]
    }
  ],
  "usage": { "input_tokens": 8, "output_tokens": 14 }
}

Teks balasan ada di item output bertipe message, di dalam part content bertipe output_text. Perhatikan nama field usage di sini adalah input_tokens/output_tokens, bukan prompt_tokens/completion_tokens seperti /v1/chat/completions.

Catatan cakupan saat ini: pemindaian dan redaksi PII mencakup isi input dan instructions — PII di instruksi sistem diperlakukan sama, tidak lolos begitu saja. Keduanya berbagi satu penomoran placeholder ([NIK_1], [NIK_2], …) supaya nilai asli tetap bisa dipulihkan tanpa ambigu. Redaksi diterapkan ke request yang dikirim ke provider, sama seperti dua endpoint di atas; redaksi pada response yang diterima balik dari provider belum diimplementasikan.

Embeddings

POST /v1/embeddings — ubah teks jadi vektor angka, format OpenAI Embeddings API. Dipakai buat pencarian semantik, RAG, klasifikasi, atau deduplikasi. Model yang tersedia: text-embedding-3-small.

Autentikasi

Header Authorization: Bearer, sama seperti /v1/chat/completions:

Authorization: Bearer sk-awn-xxxxxxxxxxxxxxxxxxxxxxxx

Body request

FieldTipeKeterangan
modelstringWajib. Salah satu Model ID embedding di tabel atas, mis. text-embedding-3-small.
inputstring / array stringWajib. Satu teks, atau array teks untuk beberapa embedding sekaligus dalam satu request.
dimensionsnumberOpsional. Perkecil panjang vektor hasil; kalau dikosongkan, dipakai dimensi bawaan model.
encoding_formatstringOpsional. "float" (default) atau "base64", diteruskan apa adanya ke provider.

Contoh request

curl -X POST https://ai.awansiber.co.id/v1/embeddings \
  -H "Authorization: Bearer sk-awn-xxxxxxxxxxxxxxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "text-embedding-3-small",
    "input": "Halo dunia"
  }'

Contoh response

{
  "object": "list",
  "model": "text-embedding-3-small",
  "data": [
    {
      "object": "embedding",
      "index": 0,
      "embedding": [0.0023, -0.0114, 0.0187, ...]
    }
  ],
  "usage": { "prompt_tokens": 3, "total_tokens": 3 }
}

Tiap item di data punya embedding (array angka) dan index yang cocok dengan urutan input — kalau input berupa array tiga teks, data berisi tiga item dengan index 0, 1, dan 2.

Catatan penagihan dan streaming: embedding hanya menagih token input — tidak ada output token sama sekali, jadi tarif output untuk model embedding adalah 0 dan biaya request sepenuhnya dihitung dari prompt_tokens. Karena itu usage di sini cuma berisi prompt_tokens dan total_tokens, tanpa completion_tokens. Endpoint ini juga tidak punya mode streaming: field stream tidak berlaku, response selalu dikirim sekaligus sebagai satu JSON.

Kode error

StatusErrorKeterangan
400unsupported_modelModel ID tidak ada di daftar tersedia.
401missing_api_key / invalid_api_keyHeader Authorization hilang atau key tidak valid/revoked.
402insufficient_balanceSaldo tenant tidak cukup untuk estimasi biaya maksimum request ini — topup dulu lewat dashboard.
422pii_detectedTenant mengaktifkan PII mode block dan request mengandung data pribadi.
429rate_limit_exceededTerlalu banyak request per menit untuk API key ini — cek header Retry-After.
502upstream_errorProvider model gagal merespons (hanya pada mode non-stream — mode stream sudah kadung mengirim event sebagian).