Autenticación
Cada solicitud lleva tu clave API en un header. Una clave por cuenta funciona en todos los endpoints y todos los modelos, en cualquiera de dos formas de header.
Header · SDK de OpenAI
Authorization: Bearer YOUR_API_KEY Header · SDK de Anthropic
x-api-key: YOUR_API_KEY Headers aceptados
Ambos headers se leen en cada endpoint /v1, sea cual sea el formato que hable el endpoint. Envía uno de ellos.
| Header | Descripción |
|---|---|
Authorization: Bearer <key> | Se comprueba primero. Escribe Bearer con B mayúscula y un espacio antes de la clave. Los SDK de OpenAI envían este header. |
x-api-key: <key> | Se lee cuando la solicitud no tiene header Authorization: Bearer. Los SDK de Anthropic envían este header. |
Con un SDK de OpenAI, configura la clave y la URL base; el SDK envía 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!"}
]
}' Con un SDK de Anthropic, configura la clave y la URL base sin /v1; el SDK envía 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!"}
]
}' Qué endpoints necesitan clave
| Endpoint | Clave |
|---|---|
POST /v1/chat/completions | Obligatoria |
POST /v1/messages | Obligatoria |
POST /v1/responses | Obligatoria |
POST /v1/tokenize | Obligatoria |
POST /v1/messages/count_tokens | Obligatoria |
GET /v1/models | No hace falta |
Tu clave
- Una clave es
sk-seguido de 43 caracteres deA–Z,a–z,0–9,-y_: 46 caracteres en total. - Cada cuenta tiene exactamente una clave. Se crea la primera vez que abres Claves y uso.
- La clave da acceso completo a la API para tu cuenta: todos los endpoints, todos los modelos y todo el saldo.
- Una clave no tiene fecha de caducidad. Funciona hasta que la rotes o la revoques.
Rotar y revocar
Rotas y revocas la clave en la página Claves y uso. Claves y uso
| Acción | Qué ocurre |
|---|---|
| Rotar | Se emite una clave nueva y la antigua deja de funcionar. La clave nueva funciona de inmediato. |
| Revocar | La clave deja de funcionar y no se emite ninguna clave nueva. Rota para volver a tener una clave que funcione. |
- Ambas acciones surten efecto de inmediato: la siguiente solicitud con la clave antigua recibe
401. Considera 60 segundos como el límite máximo antes de que la clave antigua sea rechazada en todas partes. - Todos los clientes de la cuenta usan la misma clave, así que una rotación los alcanza a todos. Pon la clave nueva en tus clientes justo después de rotar.
- El saldo, el uso y la protección contra flood pertenecen a la cuenta, no a la clave. Una clave nueva continúa con el mismo saldo y el mismo recuento de solicitudes del minuto actual.
Errores
Todo fallo de autenticación tiene el estado 401 y el tipo authentication_error. El mensaje distingue los casos.
| Estado | Tipo | Mensaje | Cuándo |
|---|---|---|---|
401 | authentication_error | Missing authentication | La solicitud no tiene ni un header Authorization: Bearer ni un header x-api-key que empiece por sk-. Es también la respuesta a bearer en minúsculas y a un valor de Authorization sin Bearer. |
401 | authentication_error | Invalid API key | La clave no es la clave actual de una cuenta: está mal escrita, fue revocada o fue reemplazada por una rotación. |
{
"error": {
"type": "authentication_error",
"message": "Invalid API key",
"code": "invalid_api_key",
"param": null
}
} {
"type": "error",
"error": {
"type": "authentication_error",
"message": "Invalid API key"
}
} - En todas las rutas excepto
/v1/messages, el objetoerrortambién contienecode: "invalid_api_key", incluso cuando falta la clave, yparam: null. - La clave se comprueba antes de leer el cuerpo. Una solicitud sin una clave válida recibe
401aunque su cuerpo no sea válido o sea demasiado grande. - Un valor de
Authorization: Bearerque no empieza porsk-no se trata como clave API. Recibe401con un mensaje de que el token no es válido o ha caducado.
Navegadores y CORS
- La API responde a solicitudes de navegador entre orígenes (cross-origin) solo para una lista fija de orígenes. El JavaScript de una página de otro origen no puede leer las respuestas de
/v1. - Llama a la API desde tu servidor y haz que tu página se comunique con tu servidor. Así además la clave queda fuera del código fuente de la página.
- El código del lado del servidor y las herramientas de línea de comandos no se ven afectados: esta regla solo la aplican los navegadores.
- Iniciar sesión en shannon-ai.com no autentica las solicitudes a
/v1. Allí no se leen las cookies; la clave es la única credencial. - Para un origen permitido, un navegador puede enviar
content-type,authorization,x-api-key,anthropic-version,anthropic-beta,openai-betayx-request-id, y puede leer el header de respuestax-request-id.
Cómo proteger la clave
- Mantén la clave en un servidor. No la pongas en páginas web, apps móviles ni repositorios públicos: quien la tenga puede gastar todo tu saldo.
- Carga la clave desde una variable de entorno o un almacén de secretos en lugar de escribirla en el código.
- Si la clave pudo haberse filtrado, rótala en Claves y uso. La clave antigua deja de funcionar de inmediato.
- Tras una filtración, lee la lista de solicitudes en Claves y uso. Muestra todas las solicitudes que la clave hizo en los últimos 30 días.