Autentikasi
Setiap permintaan membawa kunci API Anda di sebuah header. Satu kunci per akun berfungsi di setiap endpoint dan setiap model, dalam salah satu dari dua bentuk header.
Header · SDK OpenAI
Authorization: Bearer YOUR_API_KEY Header · SDK Anthropic
x-api-key: YOUR_API_KEY Header yang diterima
Kedua header dibaca di setiap endpoint /v1, apa pun format yang digunakan endpoint tersebut. Kirim salah satunya.
| Header | Deskripsi |
|---|---|
Authorization: Bearer <key> | Diperiksa pertama. Tulis Bearer dengan huruf B kapital dan satu spasi sebelum kunci. SDK OpenAI mengirim header ini. |
x-api-key: <key> | Dibaca ketika permintaan tidak memiliki header Authorization: Bearer. SDK Anthropic mengirim header ini. |
Dengan SDK OpenAI, atur kunci dan base URL; SDK mengirim Authorization: Bearer.
from openai import OpenAI
client = OpenAI(
api_key="YOUR_API_KEY",
base_url="https://api.shannon-ai.com/v1"
)
response = client.chat.completions.create(
model="shannon-3",
messages=[
{"role": "user", "content": "Hello, Shannon!"}
]
)
print(response.choices[0].message.content) import OpenAI from 'openai';
const client = new OpenAI({
apiKey: 'YOUR_API_KEY',
baseURL: 'https://api.shannon-ai.com/v1'
});
const response = await client.chat.completions.create({
model: 'shannon-3',
messages: [
{ role: 'user', content: 'Hello, Shannon!' }
]
});
console.log(response.choices[0].message.content); curl -X POST "https://api.shannon-ai.com/v1/chat/completions" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "shannon-3",
"messages": [
{"role": "user", "content": "Hello, Shannon!"}
]
}' Dengan SDK Anthropic, atur kunci dan base URL tanpa /v1; SDK mengirim x-api-key.
import anthropic
client = anthropic.Anthropic(
api_key="YOUR_API_KEY",
base_url="https://api.shannon-ai.com"
)
message = client.messages.create(
model="shannon-3",
max_tokens=1024,
messages=[
{"role": "user", "content": "Hello, Shannon!"}
]
)
print("".join(block.text for block in message.content if block.type == "text")) import Anthropic from '@anthropic-ai/sdk';
const client = new Anthropic({
apiKey: 'YOUR_API_KEY',
baseURL: 'https://api.shannon-ai.com'
});
const message = await client.messages.create({
model: 'shannon-3',
max_tokens: 1024,
messages: [
{ role: 'user', content: 'Hello, Shannon!' }
]
});
console.log(message.content.filter((block) => block.type === 'text').map((block) => block.text).join('')); curl -X POST "https://api.shannon-ai.com/v1/messages" \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "shannon-3",
"max_tokens": 1024,
"messages": [
{"role": "user", "content": "Hello, Shannon!"}
]
}' Endpoint mana yang memerlukan kunci
| Endpoint | Kunci |
|---|---|
POST /v1/chat/completions | Wajib |
POST /v1/messages | Wajib |
POST /v1/responses | Wajib |
POST /v1/tokenize | Wajib |
POST /v1/messages/count_tokens | Wajib |
GET /v1/models | Tidak diperlukan |
Kunci Anda
- Kunci berupa
sk-diikuti 43 karakter dariA–Z,a–z,0–9,-, dan_: total 46 karakter. - Setiap akun memiliki tepat satu kunci. Kunci dibuat saat pertama kali Anda membuka Keys & usage.
- Kunci memberi akses penuh ke API untuk akun Anda: setiap endpoint, setiap model, dan seluruh saldo.
- Kunci tidak memiliki tanggal kedaluwarsa. Kunci berfungsi sampai Anda merotasi atau mencabutnya.
Rotasi dan cabut
Anda merotasi dan mencabut kunci di halaman Keys & usage. Keys & usage
| Aksi | Yang terjadi |
|---|---|
| Rotasi | Kunci baru diterbitkan dan kunci lama berhenti berfungsi. Kunci baru langsung berfungsi. |
| Cabut | Kunci berhenti berfungsi dan tidak ada kunci baru yang diterbitkan. Rotasi untuk mendapatkan kunci yang berfungsi lagi. |
- Keduanya berlaku langsung: permintaan berikutnya dengan kunci lama dijawab dengan
401. Anggap 60 detik sebagai batas atas sebelum kunci lama ditolak di mana-mana. - Semua klien akun memakai kunci yang sama, jadi rotasi berdampak pada semuanya. Masukkan kunci baru ke klien Anda segera setelah merotasi.
- Saldo, penggunaan, dan flood protection milik akun, bukan milik kunci. Kunci baru melanjutkan dengan saldo yang sama dan hitungan permintaan yang sama untuk menit berjalan.
Error
Setiap kegagalan autentikasi berstatus 401 dan bertipe authentication_error. Pesannya membedakan kasus-kasusnya.
| Status | Tipe | Pesan | Kapan |
|---|---|---|---|
401 | authentication_error | Missing authentication | Permintaan tidak memiliki header Authorization: Bearer maupun header x-api-key yang diawali sk-. Ini juga balasan untuk bearer dengan huruf kecil dan untuk nilai Authorization tanpa Bearer. |
401 | authentication_error | Invalid API key | Kunci bukan kunci akun yang berlaku saat ini: salah ketik, sudah dicabut, atau sudah diganti oleh rotasi. |
{
"error": {
"type": "authentication_error",
"message": "Invalid API key",
"code": "invalid_api_key",
"param": null
}
} {
"type": "error",
"error": {
"type": "authentication_error",
"message": "Invalid API key"
}
} - Di semua path kecuali
/v1/messages, objekerrorjuga berisicode: "invalid_api_key", termasuk untuk kunci yang tidak ada, sertaparam: null. - Kunci diperiksa sebelum body dibaca. Permintaan tanpa kunci yang valid mendapat
401meskipun body-nya tidak valid atau terlalu besar. - Nilai
Authorization: Beareryang tidak diawalisk-tidak diperlakukan sebagai API key. Nilai itu mendapat401dengan pesan bahwa token tidak valid atau sudah kedaluwarsa.
Browser dan CORS
- API hanya menjawab permintaan browser lintas origin untuk daftar origin yang tetap. JavaScript di halaman dengan origin lain tidak dapat membaca balasan
/v1. - Panggil API dari server Anda dan biarkan halaman Anda berbicara dengan server Anda. Dengan begitu kunci juga tidak ada di sumber halaman.
- Kode sisi server dan tool baris perintah tidak terpengaruh: aturan ini hanya diterapkan oleh browser.
- Login di shannon-ai.com tidak mengautentikasi permintaan
/v1. Cookie tidak dibaca di sana; kunci adalah satu-satunya kredensial. - Untuk origin yang diizinkan, browser boleh mengirim
content-type,authorization,x-api-key,anthropic-version,anthropic-beta,openai-beta, danx-request-id, serta boleh membaca header balasanx-request-id.
Menjaga kunci tetap aman
- Simpan kunci di server. Jangan letakkan di halaman web, aplikasi seluler, atau repositori publik: siapa pun yang memegangnya dapat menghabiskan seluruh saldo Anda.
- Muat kunci dari environment variable atau secret store, jangan menuliskannya ke dalam kode.
- Jika kunci mungkin bocor, rotasi di Keys & usage. Kunci lama langsung berhenti berfungsi.
- Setelah kebocoran, baca daftar permintaan di Keys & usage. Daftar itu menampilkan setiap permintaan yang dibuat kunci dalam 30 hari terakhir.