Dokumentasi
Satu endpoint chat yang kompatibel dengan SDK populer, tarif rupiah per token, dan saldo prabayar via QRIS.
Base URL: https://tokenrouter.ai.id/v1. Endpoint OpenAI-compatible ada di /chat/completions, versi Anthropic di /messages, dan daftar model di /models. Kirim key lewat Authorization: Bearer <api-key> atau x-api-key: <api-key>.
Mulai cepat
Tiga langkah dari nol ke request pertama.
Buat API key
Buka halaman API key (login dulu di /masuk), lalu buat key baru. Key lengkap hanya tampil sekali.
Ganti base URL
Pakai https://tokenrouter.ai.id/v1 di SDK atau HTTP client yang sudah kamu pakai.
Pilih model
Isi deepseek/deepseek-v4.1-flash pada field model, lalu kirim pesan pertama.
curl https://tokenrouter.ai.id/v1/chat/completions \
-H "Authorization: Bearer $TOKENROUTER_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "deepseek/deepseek-v4.1-flash",
"messages": [
{"role": "user", "content": "Halo, kenalkan dirimu."}
],
"stream": true
}'
from openai import OpenAI
client = OpenAI(
base_url="https://tokenrouter.ai.id/v1",
api_key="sk-tr-...",
)
stream = client.chat.completions.create(
model="deepseek/deepseek-v4.1-flash",
messages=[{"role": "user", "content": "Halo!"}],
stream=True,
)
for chunk in stream:
print(chunk.choices[0].delta.content or "", end="")
import OpenAI from "openai";
const client = new OpenAI({
baseURL: "https://tokenrouter.ai.id/v1",
apiKey: process.env.TOKENROUTER_API_KEY,
});
const stream = await client.chat.completions.create({
model: "deepseek/deepseek-v4.1-flash",
messages: [{ role: "user", content: "Halo!" }],
stream: true,
});
for await (const chunk of stream) {
process.stdout.write(chunk.choices[0]?.delta?.content || "");
}
$client = new \GuzzleHttp\Client();
$response = $client->post('https://tokenrouter.ai.id/v1/chat/completions', [
'headers' => [
'Authorization' => 'Bearer ' . getenv('TOKENROUTER_API_KEY'),
'Content-Type' => 'application/json',
],
'json' => [
'model' => 'deepseek/deepseek-v4.1-flash',
'messages' => [['role' => 'user', 'content' => 'Halo!']],
'stream' => false,
],
]);
$data = json_decode($response->getBody(), true);
echo $data['choices'][0]['message']['content'];
Autentikasi
Setiap request wajib membawa API key di header Authorization.
Format key: tr- diikuti 48 karakter hex. Key disimpan sebagai hash SHA-256 di server, jadi simpan salinannya saat dibuat. Jangan menaruh key di kode client-side atau repositori publik.
Authorization: Bearer tr-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Content-Type: application/json
# alternatif
x-api-key: tr-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Key bisa dibuat terpisah per aplikasi dan dicabut kapan saja dari halaman API key. Saldo dan pemakaian dihitung per akun.
Chat completions
POST https://tokenrouter.ai.id/v1/chat/completions
Parameter
| Field | Tipe | Wajib | Keterangan |
|---|---|---|---|
model | string | Ya | ID model, contoh deepseek/deepseek-v4.1-flash. |
messages | array | Ya | Daftar pesan role + content. |
stream | boolean | Tidak | true untuk SSE token bertahap. |
temperature | number | Tidak | 0 sampai 2. Default 0,7. |
max_tokens | integer | Tidak | 16 sampai 2048. Default 900. |
system | string | Tidak | System prompt singkat. |
Contoh response
{
"id": "chatcmpl_9f2c...",
"object": "chat.completion",
"model": "deepseek/deepseek-v4.1-flash",
"choices": [{
"index": 0,
"message": {
"role": "assistant",
"content": "Halo! Aku DeepSeek V4.1 Flash..."
},
"finish_reason": "stop"
}],
"usage": {
"prompt_tokens": 18,
"completion_tokens": 14,
"total_tokens": 32
}
}
Streaming
Dengan stream: true, respons dikirim sebagai text/event-stream. Tiap baris berisi data: {json} dan diakhiri data: [DONE]. Chunk terakhir membawa objek usage berisi jumlah token.
Messages (Anthropic)
POST https://tokenrouter.ai.id/v1/messages
Kalau kamu memakai SDK Anthropic, arahkan base URL ke https://tokenrouter.ai.id/v1 dan kirim key lewat x-api-key atau Authorization: Bearer. Request dan respons mengikuti bentuk Messages API, termasuk system, max_tokens, dan stream: true.
curl https://tokenrouter.ai.id/v1/messages \
-H "x-api-key: tr-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{
"model": "deepseek/deepseek-v4.1-flash",
"max_tokens": 300,
"messages": [{"role": "user", "content": "Halo!"}]
}'
Streaming
Dengan stream: true, server mengirim event SSE message_start, content_block_start, content_block_delta, content_block_stop, message_delta, dan message_stop — persis seperti yang diharapkan SDK Anthropic.
Model & harga
Tarif per 1 juta token dalam rupiah. Tanpa biaya langganan.
| Model | Konteks | Input /1M | Cache /1M | Output /1M | Status |
|---|---|---|---|---|---|
DeepSeek V4.1 Flashdeepseek/deepseek-v4.1-flash
|
1M | Rp 25 | Rp 10 | Rp 50 | Operasional |
DeepSeek V4.1 Prodeepseek/deepseek-v4.1-pro
|
512K | Rp 7.000 | Rp 700 | Rp 28.000 | Segera |
GPT-6.1 Solopenai/gpt-6.1-sol
|
1M | Rp 33.000 | Rp 3.300 | Rp 132.000 | Segera |
Claude Sonnet 5.5anthropic/claude-sonnet-5.5
|
1M | Rp 49.500 | Rp 4.950 | Rp 247.500 | Segera |
Gemini 4 Argongoogle/gemini-4-argon
|
2M | Rp 20.000 | Rp 2.000 | Rp 80.000 | Segera |
Kimi K3moonshotai/kimi-k3
|
256K | Rp 9.000 | Rp 900 | Rp 36.000 | Segera |
GLM 5.3z-ai/glm-5.3
|
200K | Rp 7.500 | Rp 750 | Rp 30.000 | Segera |
MiniMax M3.1 Flashminimax/minimax-m3.1-flash
|
1M | Rp 2.000 | Rp 200 | Rp 8.000 | Segera |
MiMo v2.6 Flashxiaomi/mimo-v2.6-flash
|
256K | Rp 1.500 | Rp 150 | Rp 6.000 | Segera |
Grok 4.7x-ai/grok-4.7
|
2M | Rp 45.000 | Rp 4.500 | Rp 225.000 | Segera |
Token yang terbaca dari cache dihitung dengan tarif cache /1M yang jauh lebih murah. Daftar yang selalu terkini juga tersedia di GET https://tokenrouter.ai.id/v1/models.
Model mitra marketplace
Model dari gateway mitra dipakai lewat API key dan saldo yang sama. Harga di bawah adalah harga jual mitra apa adanya — TokenRouter tidak menambah markup. Komisi platform 5% dan biaya pencairan Rp 2.500 hanya dipotong dari penghasilan penjual, bukan dari pembeli.
| Model | Mitra | Konteks | Input /1M | Cache /1M | Output /1M | Status |
|---|
Batas laju
Perlindungan dasar supaya satu klien tidak menghabiskan kuota bersama.
Playground dan endpoint demo dibatasi 80 request per jam per IP. Setiap respons menyertakan header berikut:
| Header | Arti |
|---|---|
X-RateLimit-Limit | Jumlah maksimum request per jendela waktu. |
X-RateLimit-Remaining | Sisa request pada jendela berjalan. |
Retry-After | Detik sampai boleh mencoba lagi (saat 429). |
Terapkan backoff eksponensial saat menerima 429. Batas untuk key produksi diatur terpisah di konsol.
Error & status
Endpoint internal memakai bentuk ok/error; endpoint /v1/* memakai bentuk resmi OpenAI/Anthropic.
{
"ok": false,
"error": {
"code": "rate_limited",
"message": "Terlalu banyak percobaan. Coba lagi nanti."
}
}
| Status | Kapan muncul | Yang harus dilakukan |
|---|---|---|
400 | Body bukan JSON atau tidak lengkap. | Periksa format request. |
401 | API key tidak ada, salah, atau dicabut. | Buat key baru di halaman API key. |
402 | Saldo tidak cukup untuk request ini. | Top up di halaman Top up. |
404 | Rute atau model tidak ada. | Cek base URL, path, dan ID model. |
405 | Method tidak didukung. | Pakai POST untuk chat. |
413 | Payload melebihi 128 KB. | Kurangi riwayat pesan. |
422 | Field tidak valid, mis. model atau email. | Ikuti pesan error pada respons. |
429 | Batas laju tercapai. | Tunggu sesuai Retry-After. |
500 | Gangguan penyimpanan atau upstream. | Ulangi dengan backoff, lalu hubungi kami. |
503 | Model sedang gangguan atau belum dirilis. | Cek status model di halaman Status. |
Top up & saldo
Saldo prabayar rupiah, tanpa kartu kredit.
Isi saldo mulai Rp 1.000 lewat QRIS. Bisa dibayar dengan GoPay, OVO, DANA, ShopeePay, atau m-banking. Bonus top up (default 0%) ikut menambah saldo dan langsung terpakai per token.
Harga di katalog sudah final dalam rupiah — tidak ada biaya konversi mata uang atau biaya tersembunyi.
Buka halaman Top up