API VibeCode
Pakai model VibeCode dari alat atau kodemu sendiri lewat satu kunci. API-nya mengikuti format OpenAI: ganti alamat dasar dan kuncinya, selebihnya sama. Kamu membayar per token dari saldo Credit.
1Siapkan akun dan Credit
Kunci API dibuat dari akun VibeCode yang sama dengan di aplikasi. Belum punya akun? Daftar di Dashboard, gratis.
API dibayar dari saldo dompet Credit saja. Jatah paket Pro dan Max tidak terpakai, dan batas harian aplikasi tidak berlaku di sini.
Syarat membuat kunci: kamu pernah mengisi saldo atau membeli paket lewat QRIS dan pembayarannya sudah lunas. Isi ulang manual oleh admin tidak dihitung. Isi saldo di halaman Credit dengan nominal bebas, kelipatan Rp1.000, mulai Rp5.000 sampai Rp100.000. Nominal itu belum termasuk pajak dan biaya admin 13%.
2Buat kunci
Kunci kamu
Buat, lihat, dan cabut kunci di Dashboard. Kunci baru tampil sekali, tepat setelah dibuat.
Buka Kunci APIKunci tampil sekali saja, tepat setelah dibuat. Server hanya menyimpan sidik jarinya (hash), jadi kunci yang hilang tidak bisa dilihat lagi: cabut, lalu buat yang baru. Satu akun punya paling banyak 10 kunci aktif dan bisa membuat paling banyak 30 kunci baru per hari.
Beri tiap kunci nama aplikasi atau alat yang memakainya, supaya mudah dicabut satu per satu.
3Panggilan pertama
Alamat dasar API adalah https://api.vibecodeagent.my.id/v1. Kirim kuncimu di header Authorization: Bearer sk-vc-…. Simpan kunci di variabel lingkungan, jangan di kode:
export VIBECODE_API_KEY="sk-vc-..."curl https://api.vibecodeagent.my.id/v1/chat/completions \
-H "Authorization: Bearer $VIBECODE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "deepseek-v4.1-flash",
"messages": [{"role": "user", "content": "Halo! Perkenalkan dirimu dalam satu kalimat."}]
}'import os
from openai import OpenAI
client = OpenAI(
base_url="https://api.vibecodeagent.my.id/v1",
api_key=os.environ["VIBECODE_API_KEY"],
)
jawaban = client.chat.completions.create(
model="deepseek-v4.1-flash",
messages=[{"role": "user", "content": "Halo! Perkenalkan dirimu dalam satu kalimat."}],
)
print(jawaban.choices[0].message.content)import OpenAI from "openai";
const client = new OpenAI({
baseURL: "https://api.vibecodeagent.my.id/v1",
apiKey: process.env.VIBECODE_API_KEY,
});
const jawaban = await client.chat.completions.create({
model: "deepseek-v4.1-flash",
messages: [{ role: "user", content: "Halo! Perkenalkan dirimu dalam satu kalimat." }],
});
console.log(jawaban.choices[0].message.content);Ganti deepseek-v4.1-flash dengan id dari daftar model. Jawabannya berbentuk chat completion standar: teks ada di choices[0].message.content, dan usage berisi jumlah token yang ditagih.
Parameter permintaan
Satu-satunya rute chat adalah POST /v1/chat/completions. Parameter yang diteruskan ke model ada di tabel ini; parameter lain dibuang tanpa galat.
| Parameter | Keterangan |
|---|---|
model | Wajib. Id dari daftar model. |
messages | Wajib. Larik pesan ala OpenAI. |
tools | Pemanggilan fungsi. Hanya berjalan di model yang mendukungnya. |
tool_choice | Pemanggilan fungsi. Hanya berjalan di model yang mendukungnya. |
parallel_tool_calls | Pemanggilan fungsi. Hanya berjalan di model yang mendukungnya. |
stream | true untuk menerima Server-Sent Events. |
max_tokens | Bilangan bulat, minimal 1. Bila keduanya ada, yang lebih besar yang dipakai. |
max_completion_tokens | Bilangan bulat, minimal 1. Bila keduanya ada, yang lebih besar yang dipakai. |
temperature | Diteruskan ke model; efeknya mengikuti model. |
top_p | Diteruskan ke model; efeknya mengikuti model. |
frequency_penalty | Diteruskan ke model; efeknya mengikuti model. |
presence_penalty | Diteruskan ke model; efeknya mengikuti model. |
stop | Diteruskan ke model; efeknya mengikuti model. |
seed | Diteruskan ke model; efeknya mengikuti model. |
n | Hanya 1. |
response_format | Diteruskan ke model; lihat bagian Format respons. |
user | Diteruskan ke model. |
stream_options | Hanya include_usage yang dibaca: bila true, bingkai terakhir membawa usage. |
models ditolak (400 unsupported_parameter), dan n selain 1 ditolak (400 unsupported_value).Streaming
Kirim "stream": true untuk menerima Server-Sent Events. Tiap bingkai adalah chat.completion.chunk, dan aliran ditutup dengan data: [DONE].
Bingkai usage hanya dikirim bila kamu meminta lewat stream_options: {"include_usage": true}. Tagihanmu tidak bergantung pada itu: kami menghitung dari pemakaian yang dilaporkan model, dan kalau angkanya tidak sampai, caranya ada di bagian Cara tagih.
curl -N https://api.vibecodeagent.my.id/v1/chat/completions \
-H "Authorization: Bearer $VIBECODE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "deepseek-v4.1-flash",
"messages": [{"role": "user", "content": "Tulis haiku tentang senja."}],
"stream": true,
"stream_options": {"include_usage": true}
}'import os
from openai import OpenAI
client = OpenAI(
base_url="https://api.vibecodeagent.my.id/v1",
api_key=os.environ["VIBECODE_API_KEY"],
)
stream = client.chat.completions.create(
model="deepseek-v4.1-flash",
messages=[{"role": "user", "content": "Tulis haiku tentang senja."}],
stream=True,
stream_options={"include_usage": True},
)
for bagian in stream:
if bagian.choices:
print(bagian.choices[0].delta.content or "", end="", flush=True)
if bagian.usage:
print(f"\n[token: {bagian.usage.prompt_tokens} masuk, {bagian.usage.completion_tokens} keluar]")import OpenAI from "openai";
const client = new OpenAI({
baseURL: "https://api.vibecodeagent.my.id/v1",
apiKey: process.env.VIBECODE_API_KEY,
});
const stream = await client.chat.completions.create({
model: "deepseek-v4.1-flash",
messages: [{ role: "user", content: "Tulis haiku tentang senja." }],
stream: true,
stream_options: { include_usage: true },
});
for await (const bagian of stream) {
const teks = bagian.choices?.[0]?.delta?.content;
if (teks) process.stdout.write(teks);
if (bagian.usage) {
console.log(`\n[token: ${bagian.usage.prompt_tokens} masuk, ${bagian.usage.completion_tokens} keluar]`);
}
}Pemanggilan fungsi (tools)
Kirim definisi fungsi lewat tools; model membalas dengan tool_calls. Di mode streaming, arguments datang bertahap dengan index yang sama, jadi sambungkan potongannya sebelum mengurai JSON. Tidak semua model mendukung pemanggilan fungsi: coba dulu pada model yang kamu pilih.
curl https://api.vibecodeagent.my.id/v1/chat/completions \
-H "Authorization: Bearer $VIBECODE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "deepseek-v4.1-flash",
"messages": [{"role": "user", "content": "Cuaca di Bandung sekarang?"}],
"tools": [{
"type": "function",
"function": {
"name": "cuaca_kota",
"description": "Ambil cuaca terkini untuk satu kota.",
"parameters": {
"type": "object",
"properties": {"kota": {"type": "string"}},
"required": ["kota"]
}
}
}]
}'import os
from openai import OpenAI
client = OpenAI(
base_url="https://api.vibecodeagent.my.id/v1",
api_key=os.environ["VIBECODE_API_KEY"],
)
alat = [{
"type": "function",
"function": {
"name": "cuaca_kota",
"description": "Ambil cuaca terkini untuk satu kota.",
"parameters": {
"type": "object",
"properties": {"kota": {"type": "string"}},
"required": ["kota"],
},
},
}]
jawaban = client.chat.completions.create(
model="deepseek-v4.1-flash",
messages=[{"role": "user", "content": "Cuaca di Bandung sekarang?"}],
tools=alat,
)
panggilan = jawaban.choices[0].message.tool_calls
if panggilan:
print(panggilan[0].function.name, panggilan[0].function.arguments)import OpenAI from "openai";
const client = new OpenAI({
baseURL: "https://api.vibecodeagent.my.id/v1",
apiKey: process.env.VIBECODE_API_KEY,
});
const alat = [{
type: "function",
function: {
name: "cuaca_kota",
description: "Ambil cuaca terkini untuk satu kota.",
parameters: {
type: "object",
properties: { kota: { type: "string" } },
required: ["kota"],
},
},
}];
const jawaban = await client.chat.completions.create({
model: "deepseek-v4.1-flash",
messages: [{ role: "user", content: "Cuaca di Bandung sekarang?" }],
tools: alat,
});
const panggilan = jawaban.choices[0].message.tool_calls;
if (panggilan) {
console.log(panggilan[0].function.name, panggilan[0].function.arguments);
}Kirim hasil fungsinya kembali sebagai pesan role: "tool" dengan tool_call_id yang sama, seperti di OpenAI.
Format respons
response_format diteruskan ke model. {"type": "json_object"} hanya berlaku di model yang mendukungnya; model lain bisa mengabaikannya atau menolaknya dengan galat 400 upstream_rejected. Minta JSON juga di prompt, dan periksa hasilnya sebelum dipakai.
{
"model": "deepseek-v4.1-flash",
"messages": [{"role": "user", "content": "Beri tiga warna dasar sebagai objek JSON."}],
"response_format": {"type": "json_object"}
}Model dan harga
Daftar di bawah dibaca langsung dari GET /v1/models, tanpa login. Harga dalam Credit per 1 juta token.
Memuat daftar model…
Angka seperti $0,292 Credit adalah Credit VibeCode, bukan dolar AS.
Harga yang ditagih sama dengan di aplikasi. Harga di daftar sudah memperhitungkan lantai tarif: $0,025 Credit untuk 1 juta token masuk dan $0,05 Credit untuk 1 juta token keluar.
GET /v1/models/{id} mengembalikan satu model; id yang tidak tersedia dijawab 404 model_not_found.
curl https://api.vibecodeagent.my.id/v1/modelsGalat
Galat berbentuk objek OpenAI, dan pesannya berbahasa Inggris:
{
"error": {
"message": "Invalid API key.",
"type": "authentication_error",
"param": null,
"code": "invalid_api_key"
}
}| code | Status | Artinya |
|---|---|---|
missing_api_key | 401 | Header Authorization tidak ada. |
invalid_api_key | 401 | Kunci salah atau sudah dicabut. |
account_disabled | 403 | Akses API akunmu dinonaktifkan oleh admin. |
rate_limit_exceeded | 429 | Melewati batas permintaan per menit per akun (biasanya 20). Ikuti Retry-After. |
capacity_exhausted | 429 | Kapasitas model sedang penuh. Ulangi sesudah Retry-After. |
insufficient_balance | 402 | Saldo kurang dari taksiran biaya permintaan; pesannya memuat angkanya. Isi saldo atau kecilkan max_tokens. |
model_not_found | 404 | Id model tidak ada atau tidak tersedia lewat API. |
request_too_large | 413 | Badan permintaan lebih dari 16 MiB. Badan yang dikirim tanpa header Content-Length (chunked) dibatasi 32 MiB. |
invalid_request_body | 400 | Badan permintaan bukan JSON yang sah. |
unsupported_parameter | 400 | Parameter tidak didukung (param menyebut namanya). |
unsupported_value | 400 | Nilai parameter tidak didukung, mis. n selain 1. |
invalid_value | 400 | Nilai parameter tidak sah, mis. max_tokens bukan bilangan bulat minimal 1. |
upstream_rejected | 400 | Model menolak permintaanmu, mis. karena parameter yang tak didukung model itu. |
upstream_error | 502 | Model atau penyedianya gagal menjawab. Coba lagi. |
service_unavailable | 503 | Layanan sedang tidak tersedia sementara. Coba lagi nanti. |
internal_error | 500 | Galat tak terduga di sisi kami. Coba lagi. |
unknown_url | 404 | Alamatnya tidak dikenal. Periksa jalur dan awalan /v1: yang tersedia hanya /v1/chat/completions, /v1/models, dan /v1/models/{id}. |
method_not_allowed | 405 | Metode HTTP tidak didukung di alamat itu; header Allow menyebut yang boleh. |
Setiap jawaban membawa header x-request-id; sertakan saat melapor masalah.
Batas laju dan antrean
Batas biasanya 20 permintaan per menit per akun (jendela geser 60 detik), dihitung lintas semua kuncimu; angka akunmu tampil di Dashboard, bagian Kunci API. Setiap jawaban chat yang lolos pemeriksaan kunci membawa x-ratelimit-limit-requests, x-ratelimit-remaining-requests, dan x-ratelimit-reset-requests.
Kapasitas model dipakai bersama aplikasi VibeCode. Saat penuh, permintaanmu mengantre sampai sekitar 45 detik; kalau tetap penuh, kamu menerima 429 capacity_exhausted. Ikuti header Retry-After (dalam detik) apa adanya: nilainya bisa hanya 1 detik.
Dengan "stream": true, model harus mulai mengirim jawaban dalam 30 detik. Tanpa stream, seluruh jawaban harus selesai dalam 30 detik; kalau tidak, kamu menerima 502 upstream_error (kami bisa mencoba lagi dulu, jadi total waktu tunggu bisa lebih lama); pakai "stream": true untuk jawaban panjang.
Cara tagih
- Tiap sisi (masuk dan keluar) dibulatkan ke atas ke satuan terkecil Credit.
- Sebelum model dijalankan, kami memesan taksiran biaya dari saldomu: token masuk ditaksir dari ukuran permintaan (kira-kira 4 byte per token), ditambah batas keluaran. Selesai, selisihnya dikembalikan.
- Kalau kamu tidak mengisi
max_tokensmaupunmax_completion_tokens, kami memasang batas keluaran sebesar yang bisa dibayar saldomu, paling banyak 32.768 token. Jawaban panjang lalu bisa berakhir denganfinish_reason: "length"; setelmax_tokenssendiri untuk jawaban panjang. - Kalau saldo tidak cukup untuk taksiran itu, permintaan ditolak 402 sebelum model dijalankan.
- Tagihan lewat API tidak pernah membuat saldomu negatif. Kalau biaya sebenarnya melebihi taksiran dan sisa saldo tidak cukup menutupnya, kamu ditagih sebesar saldo yang tersedia; kelebihannya tidak ditagihkan.
- Kalau angka
usagedari model tidak sampai (mis. aliran dari model terputus), kami menagih sesuai teks yang sudah terkirim (kira-kira 4 byte per token) dan menandainya "ditaksir" di log. - Satu kalimat identitas singkat (sekitar 30 token) ditambahkan ke permintaanmu supaya model tahu namanya; ia ikut ditagih sebagai token masuk.
- Log permintaan (tanpa isi pesan) disimpan 30 hari; ringkasan harian tetap tersimpan. Lihat di halaman Credit.
- Kalau server kami dimulai ulang tepat saat permintaanmu berjalan, saldo yang dipesan untuk permintaan itu bisa tertahan. Bila saldomu terasa kurang, hubungi admin VibeCode dan sebutkan
x-request-id.
Alat pihak ketiga
Alat apa pun yang bisa memakai endpoint "OpenAI compatible" bisa dipakai dengan tiga isian: alamat dasar https://api.vibecodeagent.my.id/v1, kunci sk-vc-…, dan id model dari daftar. Nama menu bisa berbeda antar versi alat.
Cursor
Di pengaturan model, isi OpenAI API Key dengan kuncimu dan aktifkan override alamat dasar OpenAI ke alamat di atas, lalu tambahkan id model kustom. Fitur mana yang bisa memakai model kustom ditentukan Cursor.
Cline dan Roo Code
Pilih penyedia "OpenAI Compatible", isi Base URL, API Key, dan Model ID.
Continue
Tambahkan model di berkas konfigurasi dan ganti sk-vc-... dengan kuncimu:
models:
- name: VibeCode
provider: openai
model: deepseek-v4.1-flash
apiBase: https://api.vibecodeagent.my.id/v1
apiKey: sk-vc-...n8n
Di node OpenAI Chat Model, buat kredensial dengan API Key kuncimu dan ubah Base URL ke alamat di atas.
Open WebUI
Di Admin Settings, Connections, tambahkan koneksi OpenAI dengan URL dan kunci di atas.
/v1/chat/completions dan /v1/models. Fitur alat yang butuh Responses API, embeddings, atau pembuatan gambar dan audio tidak akan jalan.Keamanan kunci
- Jangan taruh kunci di kode frontend yang publik. API ini mengizinkan permintaan dari peramban asal mana pun (CORS terbuka), jadi siapa pun yang membaca sumber halamanmu bisa memakai saldomu.
- Simpan kunci di variabel lingkungan atau penyimpan rahasia, satu kunci per aplikasi.
- Kunci yang bocor: cabut di Dashboard, bagian Kunci API. Pencabutan berlaku langsung, dan permintaan berikutnya dengan kunci itu dijawab 401.
- Kami tidak pernah meminta kuncimu lewat email atau chat.
- Rute dan token akun yang dipakai aplikasi VibeCode dan Chat web hanya untuk keduanya. Akses terprogram ke model lewat satu-satunya jalan ini: kunci
sk-vc-…. Rinciannya di Syarat dan Ketentuan.