Authentification
Chaque requête porte votre clé API dans un en-tête. Une clé par compte fonctionne sur chaque point de terminaison et chaque modèle, sous l'une des deux formes d'en-tête.
Authorization: Bearer YOUR_API_KEY x-api-key: YOUR_API_KEY En-têtes acceptés
Les deux en-têtes sont lus sur chaque point de terminaison /v1, quel que soit le format que parle le point de terminaison. Envoyez l'un des deux.
| En-tête | Description |
|---|---|
Authorization: Bearer <key> | Vérifié en premier. Écrivez Bearer avec un B majuscule et un espace avant la clé. Les SDK OpenAI envoient cet en-tête. |
x-api-key: <key> | Lu quand la requête n'a pas d'en-tête Authorization: Bearer. Les SDK Anthropic envoient cet en-tête. |
Avec un SDK OpenAI, définissez la clé et l'URL de base ; le SDK envoie 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!"}
]
}' Avec un SDK Anthropic, définissez la clé et l'URL de base sans /v1 ; le SDK envoie 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!"}
]
}' Quels points de terminaison exigent une clé
| Point de terminaison | Clé |
|---|---|
POST /v1/chat/completions | Obligatoire |
POST /v1/messages | Obligatoire |
POST /v1/responses | Obligatoire |
POST /v1/tokenize | Obligatoire |
POST /v1/messages/count_tokens | Obligatoire |
GET /v1/models | Pas nécessaire |
Votre clé
- Une clé est
sk-suivi de 43 caractères parmiA–Z,a–z,0–9,-et_: 46 caractères au total. - Chaque compte a exactement une clé. Elle est créée la première fois que vous ouvrez Clés et utilisation.
- La clé donne un accès complet à l'API pour votre compte : chaque point de terminaison, chaque modèle et la totalité du solde.
- Une clé n'a pas de date d'expiration. Elle fonctionne jusqu'à ce que vous la renouveliez ou la révoquiez.
Renouveler et révoquer
Vous renouvelez et révoquez la clé sur la page Clés et utilisation. Clés et utilisation
| Action | Ce qui se passe |
|---|---|
| Renouveler | Une nouvelle clé est émise et l'ancienne cesse de fonctionner. La nouvelle clé fonctionne immédiatement. |
| Révoquer | La clé cesse de fonctionner et aucune nouvelle clé n'est émise. Renouvelez pour obtenir de nouveau une clé valide. |
- Les deux prennent effet immédiatement : la requête suivante avec l'ancienne clé reçoit
401. Comptez 60 secondes au maximum avant que l'ancienne clé soit refusée partout. - Tous les clients du compte utilisent la même clé, donc un renouvellement les touche tous. Mettez la nouvelle clé dans vos clients juste après le renouvellement.
- Le solde, l'utilisation et la protection anti-flood appartiennent au compte, pas à la clé. Une nouvelle clé continue avec le même solde et le même nombre de requêtes pour la minute en cours.
Erreurs
Chaque échec d'authentification a le statut 401 et le type authentication_error. Le message distingue les cas.
| Statut | Type | Message | Quand |
|---|---|---|---|
401 | authentication_error | Missing authentication | La requête n'a ni en-tête Authorization: Bearer ni en-tête x-api-key commençant par sk-. C'est aussi la réponse à bearer en minuscules et à une valeur Authorization sans Bearer. |
401 | authentication_error | Invalid API key | La clé n'est pas la clé actuelle d'un compte : elle est mal saisie, elle a été révoquée ou elle a été remplacée par un renouvellement. |
{
"error": {
"type": "authentication_error",
"message": "Invalid API key",
"code": "invalid_api_key",
"param": null
}
} {
"type": "error",
"error": {
"type": "authentication_error",
"message": "Invalid API key"
}
} - Sur tous les chemins sauf
/v1/messages, l'objeterrorcontient aussicode: "invalid_api_key", y compris pour une clé manquante, etparam: null. - La clé est vérifiée avant la lecture du corps. Une requête sans clé valide reçoit
401même si son corps est invalide ou trop volumineux. - Une valeur
Authorization: Bearerqui ne commence pas parsk-n'est pas traitée comme une clé API. Elle reçoit401avec un message indiquant que le token est invalide ou expiré.
Navigateurs et CORS
- L'API répond aux requêtes de navigateur cross-origin uniquement pour une liste fixe d'origines. Le JavaScript d'une page d'une autre origine ne peut pas lire les réponses
/v1. - Appelez l'API depuis votre serveur et laissez votre page parler à votre serveur. Cela garde aussi la clé hors du code source de la page.
- Le code côté serveur et les outils en ligne de commande ne sont pas concernés : cette règle n'est appliquée que par les navigateurs.
- Une connexion sur shannon-ai.com n'authentifie pas les requêtes
/v1. Les cookies n'y sont pas lus ; la clé est le seul identifiant. - Pour une origine autorisée, un navigateur peut envoyer
content-type,authorization,x-api-key,anthropic-version,anthropic-beta,openai-betaetx-request-id, et peut lire l'en-tête de réponsex-request-id.
Protéger la clé
- Gardez la clé sur un serveur. Ne la mettez pas dans des pages web, des applications mobiles ou des dépôts publics : quiconque la détient peut dépenser tout votre solde.
- Chargez la clé depuis une variable d'environnement ou un gestionnaire de secrets au lieu de l'écrire dans le code.
- Si la clé a pu fuiter, renouvelez-la dans Clés et utilisation. L'ancienne clé cesse de fonctionner immédiatement.
- Après une fuite, consultez la liste des requêtes dans Clés et utilisation. Elle montre chaque requête effectuée avec la clé au cours des 30 derniers jours.