Lewati ke konten
kenari.

Key per tool

Buat, lihat, dan cabut key per tool. Key per tool adalah key kenari biasa yang dimiliki satu tool di satu mesin, misalnya OpenCode di laptopmu. Kalau konfigurasi satu tool bocor, kamu cukup mencabut key itu dan yang lain tetap berjalan. Endpoint ini khusus kenari dan tidak punya padanan di OpenAI maupun Anthropic.

POST /v1/account/keys, GET /v1/account/keys, dan DELETE /v1/account/keys/{id}

Hanya key yang disimpan oleh kenari login yang bisa mengelola key per tool. Lihat CLI kenari. Key lain mendapat 403 dan cli_login_key_required, termasuk:

  • Key yang kamu buat di API Keys pada dashboard, dan key dari kenari login --api-key.
  • Key per tool. Sebuah tool tidak bisa membuat key tambahan untuk dirinya sendiri.
  • Key dari kenari login yang kamu buat sebelum key per tool ada. Jalankan kenari login lagi untuk mendapat key yang bisa dipakai.

API key dibagikan mendapat shared_key_not_allowed, dan key yang dibatasi mendapat restricted_key_not_allowed. Key dibatasi kalau punya pembatasan model, batas biaya, atau batas token. Lihat Ringkasan akun.

Setiap panggilan membutuhkan key di header Authorization sebagai Bearer kn-....

POST /v1/account/keys membuat key di bawah key yang kamu pakai untuk memanggilnya.

FieldTipeWajibKeterangan
toolstringYaTool yang memakai key, misalnya opencode. 1 sampai 40 karakter dari a-z, 0-9, ., dan -.
hoststringYaMesin tempat tool berjalan, misalnya laptop. 1 sampai 64 karakter dari A-Z, a-z, 0-9, ., _, dan -.

Response-nya 201 berisi key baru:

{
"id": "e72755dd-ea6b-4d93-9e96-eb4c817824d0",
"key": "kn-984e1408144f2e604c38d27e6596638ec57882ad022a4fdd",
"prefix": "kn-984e1408",
"label": "kenari-cli · opencode · laptop",
"created_at": 1790000000
}
FieldTipeKeterangan
idstringId yang dipakai saat mencabut key.
keystringKey lengkap. Hanya ditampilkan sekali, jadi simpan sekarang.
prefixstringBeberapa karakter pertama key, untuk membedakan key.
labelstringkenari-cli · <tool> · <host>. Label yang sama tampil di samping key pada API Keys di dashboard.
created_atintegerWaktu key dibuat, dalam detik sejak Unix epoch.

Key per tool bekerja seperti key asalnya untuk semua model dan endpoint, kecuali tidak bisa mengelola key. Penagihannya sama dengan key kamu yang lain.

GET /v1/account/keys tidak menerima parameter. Endpoint ini mengembalikan key per tool yang aktif milik key yang kamu pakai untuk memanggilnya, dari yang terbaru. Key yang sudah dicabut tidak ditampilkan, dan key lengkap tidak pernah dikembalikan lagi.

{
"object": "list",
"data": [
{
"id": "e72755dd-ea6b-4d93-9e96-eb4c817824d0",
"prefix": "kn-984e1408",
"label": "kenari-cli · opencode · laptop",
"created_at": 1790000000,
"last_used_at": 1790003600
}
]
}

last_used_at adalah waktu terakhir key dipakai untuk request, dalam detik sejak Unix epoch. Nilainya null bila tidak ada pemakaian yang tercatat dalam 90 hari terakhir.

DELETE /v1/account/keys/{id} mencabut satu key per tool secara permanen. Request berikutnya yang memakainya mendapat 401.

{
"id": "e72755dd-ea6b-4d93-9e96-eb4c817824d0",
"revoked": true
}

id harus milik key per tool dari key yang kamu pakai untuk memanggil. Id lain mengembalikan 404 dan not_found, baik key tidak ada, sudah dicabut, maupun milik orang lain.

  • Satu key login bisa memegang 30 key per tool yang aktif. Cabut satu untuk membuat yang baru.
  • Key per tool dihitung dalam batas key akunmu, sama seperti key lain.
  • Setiap key login bisa membuat 20 key per menit.

Saat kamu mencabut key dari kenari login di API Keys pada dashboard, semua key per tool miliknya ikut dicabut. Mencabut satu key per tool tidak memengaruhi key login maupun key per tool lainnya. Lihat Autentikasi & API key.

Terminal window
# Buat key
curl https://kenari.id/v1/account/keys \
-H "Authorization: Bearer $KENARI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"tool": "opencode",
"host": "laptop"
}'
# Lihat key
curl https://kenari.id/v1/account/keys \
-H "Authorization: Bearer $KENARI_API_KEY"
# Cabut key
curl -X DELETE https://kenari.id/v1/account/keys/e72755dd-ea6b-4d93-9e96-eb4c817824d0 \
-H "Authorization: Bearer $KENARI_API_KEY"

Di sini $KENARI_API_KEY adalah key dari kenari login.

import os
import requests
headers = {"Authorization": f"Bearer {os.environ['KENARI_API_KEY']}"}
created = requests.post(
"https://kenari.id/v1/account/keys",
headers=headers,
json={"tool": "opencode", "host": "laptop"},
)
created.raise_for_status()
tool_key = created.json()
print(tool_key["label"])
requests.delete(
f"https://kenari.id/v1/account/keys/{tool_key['id']}",
headers=headers,
).raise_for_status()
const headers = { Authorization: `Bearer ${process.env.KENARI_API_KEY}` };
const created = await fetch("https://kenari.id/v1/account/keys", {
method: "POST",
headers: { ...headers, "Content-Type": "application/json" },
body: JSON.stringify({ tool: "opencode", host: "laptop" }),
});
if (!created.ok) throw new Error(await created.text());
const toolKey = await created.json();
console.log(toolKey.label);
const revoked = await fetch(`https://kenari.id/v1/account/keys/${toolKey.id}`, {
method: "DELETE",
headers,
});
if (!revoked.ok) throw new Error(await revoked.text());

Membuat, melihat, dan mencabut key tidak dikenai biaya. Request yang memakai key per tool ditagih seperti request lain. Lihat Cara penagihan.

StatusKodeKapan
400bad_requestBody bukan JSON dengan field string tool dan host, atau salah satunya memuat karakter atau panjang yang tidak diizinkan. Juga saat akunmu sudah mencapai batas key, dengan pesan key limit reached.
401Tidak adaKey tidak ada, tidak valid, sudah dicabut, atau sudah kedaluwarsa. Body-nya pesan teks singkat, bukan JSON.
403cli_login_key_requiredKey bukan key dari kenari login.
403shared_key_not_allowedKey adalah API key dibagikan.
403restricted_key_not_allowedKey punya pembatasan model, batas biaya, atau batas token.
404not_foundSaat mencabut, id bukan key per tool yang aktif milik key yang kamu pakai.
409child_key_capSaat membuat, key login sudah memegang 30 key per tool yang aktif.
429rate_limit_exceededSaat membuat, lebih dari 20 request dalam satu menit. Tidak ada header Retry-After. Tunggu beberapa detik lalu coba lagi.
500internal_errorAda yang gagal di kenari. Coba lagi sekali.

Lihat Error untuk format error dan kode lainnya.