Authenticatie
Elke aanvraag bevat je API-sleutel in een header. Eén sleutel per account werkt op elk endpoint en elk model, in een van twee headervormen.
Header · OpenAI SDK's
Authorization: Bearer YOUR_API_KEY Header · Anthropic SDK's
x-api-key: YOUR_API_KEY Geaccepteerde headers
Beide headers worden gelezen op elk /v1-endpoint, welk formaat het endpoint ook spreekt. Stuur er een van.
| Header | Beschrijving |
|---|---|
Authorization: Bearer <key> | Wordt eerst gecontroleerd. Schrijf Bearer met een hoofdletter B en één spatie vóór de sleutel. OpenAI SDK's sturen deze header. |
x-api-key: <key> | Wordt gelezen als de aanvraag geen Authorization: Bearer-header heeft. Anthropic SDK's sturen deze header. |
Stel bij een OpenAI SDK de sleutel en de basis-URL in; de SDK stuurt 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!"}
]
}' Stel bij een Anthropic SDK de sleutel en de basis-URL zonder /v1 in; de SDK stuurt 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!"}
]
}' Welke endpoints een sleutel nodig hebben
| Endpoint | Sleutel |
|---|---|
POST /v1/chat/completions | Vereist |
POST /v1/messages | Vereist |
POST /v1/responses | Vereist |
POST /v1/tokenize | Vereist |
POST /v1/messages/count_tokens | Vereist |
GET /v1/models | Niet nodig |
Je sleutel
- Een sleutel is
sk-gevolgd door 43 tekens uitA–Z,a–z,0–9,-en_: in totaal 46 tekens. - Elk account heeft precies één sleutel. Die wordt aangemaakt de eerste keer dat je Sleutels en gebruik opent.
- De sleutel geeft volledige toegang tot de API voor je account: elk endpoint, elk model en het hele saldo.
- Een sleutel heeft geen vervaldatum. Hij werkt tot je hem vernieuwt of intrekt.
Vernieuwen en intrekken
Je vernieuwt en trekt de sleutel in op de pagina Sleutels en gebruik. Sleutels en gebruik
| Actie | Wat er gebeurt |
|---|---|
| Vernieuwen | Er wordt een nieuwe sleutel uitgegeven en de oude sleutel werkt niet meer. De nieuwe sleutel werkt direct. |
| Intrekken | De sleutel werkt niet meer en er wordt geen nieuwe sleutel uitgegeven. Vernieuw om weer een werkende sleutel te krijgen. |
- Beide werken direct: de volgende aanvraag met de oude sleutel krijgt
401als antwoord. Reken op 60 seconden als bovengrens voordat de oude sleutel overal wordt geweigerd. - Elke client van het account gebruikt dezelfde sleutel, dus een vernieuwing bereikt ze allemaal. Zet de nieuwe sleutel direct na het vernieuwen in je clients.
- Saldo, gebruik en flood protection horen bij het account, niet bij de sleutel. Een nieuwe sleutel gaat verder met hetzelfde saldo en hetzelfde aantal aanvragen voor de huidige minuut.
Fouten
Elke authenticatiefout heeft status 401 en type authentication_error. Het bericht onderscheidt de gevallen.
| Status | Type | Bericht | Wanneer |
|---|---|---|---|
401 | authentication_error | Missing authentication | De aanvraag heeft geen Authorization: Bearer-header en geen x-api-key-header die met sk- begint. Dit is ook het antwoord op bearer in kleine letters en op een Authorization-waarde zonder Bearer. |
401 | authentication_error | Invalid API key | De sleutel is niet de huidige sleutel van een account: hij is verkeerd getypt, ingetrokken of vervangen door een vernieuwing. |
{
"error": {
"type": "authentication_error",
"message": "Invalid API key",
"code": "invalid_api_key",
"param": null
}
} {
"type": "error",
"error": {
"type": "authentication_error",
"message": "Invalid API key"
}
} - Op elk pad behalve
/v1/messagesbevat het objecterrorookcode: "invalid_api_key", ook bij een ontbrekende sleutel, enparam: null. - De sleutel wordt gecontroleerd voordat de body wordt gelezen. Een aanvraag zonder geldige sleutel krijgt
401, ook als de body ongeldig of te groot is. - Een
Authorization: Bearer-waarde die niet metsk-begint, wordt niet als API-sleutel behandeld. Ze krijgt401met een bericht dat het token ongeldig of verlopen is.
Browsers en CORS
- De API beantwoordt cross-origin browseraanvragen alleen voor een vaste lijst met origins. JavaScript op een pagina van een andere origin kan
/v1-antwoorden niet lezen. - Roep de API aan vanaf je server en laat je pagina met je server praten. Zo blijft de sleutel ook uit de paginabron.
- Code op de server en opdrachtregeltools worden hier niet door geraakt: deze regel wordt alleen door browsers toegepast.
- Een login op shannon-ai.com authenticeert geen
/v1-aanvragen. Cookies worden daar niet gelezen; de sleutel is het enige inlogbewijs. - Voor een toegestane origin mag een browser
content-type,authorization,x-api-key,anthropic-version,anthropic-beta,openai-betaenx-request-idversturen, en de antwoordheaderx-request-idlezen.
De sleutel veilig houden
- Bewaar de sleutel op een server. Zet hem niet in webpagina's, mobiele apps of openbare repositories: wie hem heeft, kan je hele saldo uitgeven.
- Laad de sleutel uit een omgevingsvariabele of een secret store in plaats van hem in code te schrijven.
- Als de sleutel gelekt kan zijn, vernieuw hem dan op Sleutels en gebruik. De oude sleutel werkt direct niet meer.
- Lees na een lek de aanvraaglijst op Sleutels en gebruik. Die toont elke aanvraag die de sleutel in de afgelopen 30 dagen heeft gedaan.