Аутентификация
Каждый запрос передает ваш API-ключ в заголовке. Один ключ на аккаунт работает на каждом эндпоинте и с каждой моделью, в любой из двух форм заголовка.
Заголовок · SDK OpenAI
Authorization: Bearer YOUR_API_KEY Заголовок · SDK Anthropic
x-api-key: YOUR_API_KEY Принимаемые заголовки
Оба заголовка читаются на каждом эндпоинте /v1, независимо от формата, на котором работает эндпоинт. Отправляйте один из них.
| Заголовок | Описание |
|---|---|
Authorization: Bearer <key> | Проверяется первым. Пишите Bearer с заглавной B и одним пробелом перед ключом. SDK OpenAI отправляют этот заголовок. |
x-api-key: <key> | Читается, если в запросе нет заголовка Authorization: Bearer. SDK Anthropic отправляют этот заголовок. |
С SDK OpenAI задайте ключ и базовый URL; SDK отправит 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!"}
]
}' С SDK Anthropic задайте ключ и базовый URL без /v1; SDK отправит 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!"}
]
}' Каким эндпоинтам нужен ключ
| Эндпоинт | Ключ |
|---|---|
POST /v1/chat/completions | Обязателен |
POST /v1/messages | Обязателен |
POST /v1/responses | Обязателен |
POST /v1/tokenize | Обязателен |
POST /v1/messages/count_tokens | Обязателен |
GET /v1/models | Не нужен |
Ваш ключ
- Ключ — это
sk-, за которым следуют 43 символа изA–Z,a–z,0–9,-и_: всего 46 символов. - У каждого аккаунта ровно один ключ. Он создается при первом открытии Keys & usage.
- Ключ дает полный доступ к API для вашего аккаунта: ко всем эндпоинтам, всем моделям и всему балансу.
- У ключа нет срока действия. Он работает, пока вы не замените или не отзовете его.
Замена и отзыв
Заменять и отзывать ключ можно на странице Keys & usage. Keys & usage
| Действие | Что происходит |
|---|---|
| Замена | Выдается новый ключ, а старый перестает работать. Новый ключ работает сразу. |
| Отзыв | Ключ перестает работать, новый ключ не выдается. Замените ключ, чтобы снова получить рабочий. |
- Оба действия вступают в силу сразу: на следующий запрос со старым ключом придет
401. Считайте 60 секунд верхней границей, после которой старый ключ отклоняется везде. - Все клиенты аккаунта используют один ключ, поэтому замена затрагивает их всех. Вставьте новый ключ в свои клиенты сразу после замены.
- Баланс, использование и защита от флуда относятся к аккаунту, а не к ключу. Новый ключ продолжает работу с тем же балансом и тем же счетчиком запросов за текущую минуту.
Ошибки
Любая ошибка аутентификации имеет статус 401 и тип authentication_error. Случаи различаются по сообщению.
| Статус | Тип | Сообщение | Когда |
|---|---|---|---|
401 | authentication_error | Missing authentication | В запросе нет ни заголовка Authorization: Bearer, ни заголовка x-api-key, начинающегося с sk-. Так же отвечает сервер на bearer в нижнем регистре и на значение Authorization без Bearer. |
401 | authentication_error | Invalid API key | Ключ не является текущим ключом аккаунта: он набран с опечаткой, был отозван или заменен при смене. |
{
"error": {
"type": "authentication_error",
"message": "Invalid API key",
"code": "invalid_api_key",
"param": null
}
} {
"type": "error",
"error": {
"type": "authentication_error",
"message": "Invalid API key"
}
} - На всех путях, кроме
/v1/messages, объектerrorтакже содержитcode: "invalid_api_key", в том числе при отсутствии ключа, иparam: null. - Ключ проверяется до чтения тела. Запрос без действительного ключа получает
401, даже если его тело некорректно или слишком велико. - Значение
Authorization: Bearer, которое не начинается сsk-, не считается API-ключом. Оно получает401с сообщением о том, что токен недействителен или просрочен.
Браузеры и CORS
- API отвечает на кросс-доменные запросы браузера только для фиксированного списка origin. JavaScript на странице другого origin не может читать ответы
/v1. - Вызывайте API со своего сервера, а страница пусть обращается к вашему серверу. Так ключ не попадет и в исходный код страницы.
- Серверный код и инструменты командной строки это не затрагивает: правило применяют только браузеры.
- Вход на shannon-ai.com не аутентифицирует запросы
/v1. Cookies там не читаются; ключ — единственные учетные данные. - Для разрешенного origin браузер может отправлять
content-type,authorization,x-api-key,anthropic-version,anthropic-beta,openai-betaиx-request-id, а также читать заголовок ответаx-request-id.
Как сберечь ключ
- Храните ключ на сервере. Не помещайте его в веб-страницы, мобильные приложения или публичные репозитории: тот, у кого он есть, может потратить весь ваш баланс.
- Загружайте ключ из переменной окружения или хранилища секретов, а не записывайте в код.
- Если ключ мог утечь, замените его на Keys & usage. Старый ключ перестанет работать сразу.
- После утечки откройте список запросов на Keys & usage. Он показывает все запросы, сделанные с этим ключом за последние 30 дней.