Primeros pasos.
La API de NaN es compatible con OpenAI. Solo necesitas dos datos, una base URL y una API key, y cualquier herramienta o SDK que acepte esos dos campos funciona con NaN sin tocar nada más.
| Campo | Valor |
|---|---|
| Base URL | https://api.nan.builders/v1 |
| API key | la tuya, empieza por sk- |
| Modelo para empezar | deepseek-v4-flash |
Consigue tu API key
Tienes que ser miembro de la comunidad NaN. Entra en cloud.nan.builders, abre los ajustes de usuario y ve a la sección API Keys para generar la tuya.
La clave es personal e intransferible, y se muestra una sola vez: cópiala en cuanto la generes. Si la pierdes, no pasa nada, genera otra y borra la vieja desde el mismo panel.
No la pegues en el código
Una clave subida a un repositorio la encuentra un bot en cuestión de minutos. Guárdala en una variable de entorno y léela desde ahí, como en los ejemplos de esta página.
Guárdala en una variable de entorno
# macOS y Linux
export NAN_API_KEY="sk-tu-clave"# Windows, PowerShell
$env:NAN_API_KEY = "sk-tu-clave"Así solo dura lo que dure esa terminal. Para que sobreviva a cerrarla, añade la línea a tu ~/.zshrc, a tu ~/.bashrc o a tu perfil de PowerShell.
Haz tu primera llamada
curl https://api.nan.builders/v1/chat/completions \
-H "Authorization: Bearer $NAN_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "deepseek-v4-flash",
"messages": [{ "role": "user", "content": "Preséntate en una línea." }]
}'Si todo va bien recibes un JSON y el texto del modelo está en choices[0].message.content:
{
"id": "chatcmpl-...",
"model": "deepseek-v4-flash",
"choices": [
{ "index": 0, "message": { "role": "assistant", "content": "Soy un modelo abierto..." } }
],
"usage": { "prompt_tokens": 14, "completion_tokens": 23, "total_tokens": 37 }
}Ya tienes acceso al clúster. Todo lo demás son variaciones de esta misma llamada.
Lo mismo desde tu código
Usa el SDK oficial de OpenAI y cámbiale la base_url. No hay librería de NaN que instalar.
# pip install openai
import os
from openai import OpenAI
client = OpenAI(
api_key=os.environ["NAN_API_KEY"],
base_url="https://api.nan.builders/v1",
)
resp = client.chat.completions.create(
model="deepseek-v4-flash",
messages=[{"role": "user", "content": "Preséntate en una línea."}],
)
print(resp.choices[0].message.content)// npm install openai
import OpenAI from 'openai';
const client = new OpenAI({
apiKey: process.env.NAN_API_KEY,
baseURL: 'https://api.nan.builders/v1',
});
const resp = await client.chat.completions.create({
model: 'deepseek-v4-flash',
messages: [{ role: 'user', content: 'Preséntate en una línea.' }],
});
console.log(resp.choices[0].message.content);Tienes más ejemplos, incluidos embeddings, voz, imágenes y búsqueda web, en Ejemplos.
Elige el modelo
deepseek-v4-flash es un buen punto de partida, pero no es el único ni el mejor para todo. La lista completa, con cuál conviene para cada cosa, está en Elige tu modelo.
Y la lista que de verdad puede usar tu clave siempre te la da la API:
curl https://api.nan.builders/v1/models \
-H "Authorization: Bearer $NAN_API_KEY"Conecta tu editor o tu agente
Cursor, Codex, VS Code, Cline, OpenCode, Zed y compañía se configuran con esos mismos dos datos. Cada uno los pide en un sitio distinto, y eso es lo que recoge Configurar tu agente, con una página por herramienta.
Claude Code es la única excepción, y no es cuestión de dónde van los campos: habla el protocolo de Anthropic, así que no apunta a NaN directamente. En su página están las dos maneras de resolverlo.
Si usas OpenCode, Codex, Pi o droid, el CLI de NaN te los configura sin que tengas que editar nada.
Si algo falla
Todos los errores llegan con el mismo formato que los de OpenAI: un JSON con error.message, error.type y un error.code corto con el que puedes ramificar en tu código.
| Código | Qué ha pasado | Qué hacer |
|---|---|---|
401 | La clave falta, está mal escrita, ya no existe, o no llega a ese modelo | Revisa la cabecera Authorization: Bearer .... Si la clave funciona con otros modelos, es el tier: glm5.3 necesita premium |
402 | Has gastado la cuota de tokens de ese modelo | Cambia de modelo o espera a que se reinicie el periodo de cuota de ese modelo |
403 | Tu plan no llega a ese endpoint | La generación de imágenes necesita membresía de inferencia |
404 | Ese id de modelo no existe | Comprueba cómo se escribe en Elige tu modelo o con GET /v1/models |
429 | Demasiadas peticiones a la vez, o cuota agotada | Reintenta esperando cada vez un poco más |
5xx | El fallo es nuestro | Reintenta; si insiste, cuéntalo en #support |
Reintentar solo tiene sentido con 429 y con los 5xx. Un 401, un 403 o un 404 van a fallar exactamente igual hasta que cambies la petición, y el 402 no se arregla insistiendo: el contador vuelve a cero cuando se reinicia el periodo de cuota de ese modelo, que es el mes natural para todo lo que se cuenta por mes y tu periodo de Stripe para glm5.3.
El detalle completo, endpoint a endpoint, está en la referencia de la API.
Los límites, en corto
Dos límites van por API key y se aplican a todo lo que llames: peticiones por minuto y peticiones a la vez.
Encima de esos, algunos modelos llevan el suyo: un techo de tokens por minuto en los modelos de chat grandes, y uno de peticiones por minuto en rerank. glm5.3 no se rige por minuto en absoluto, sino por una ventana móvil de tokens más una asignación por periodo de facturación. La búsqueda web va por un presupuesto separado del de los modelos.
Las cifras vigentes están al final de Modelos, que es donde se publican para que no haya dos versiones de la misma cifra dando vueltas.
Siguientes pasos
- Elige tu modelo: qué modelo pedir para cada tarea, y cómo se escribe su id.
- Configurar tu agente: Cursor, Claude Code, Codex, VS Code, Cline, OpenCode, Zed y el resto.
- Gentle-AI: lo que recomendamos configurar encima, una vez conectado.
- Ejemplos: fragmentos listos para copiar en Python, Node.js y curl.
- Referencia de la API: todos los endpoints, campos y errores.
- Soporte:
#supporten Discord, solo para cuestiones técnicas.