Referencia
Errores
Los errores llegan con la forma de OpenAI, con un code estable por el que puedes filtrar y un message escrito para personas. Una llamada rechazada o fallida no cuesta nada.
Revisado el 26 de octubre de 2026
La forma
{
"error": {
"type": "rate_limit_error",
"code": "daily_cap",
"message": "This call needs up to $0.02 and the key has $0.01 left of its $2.00 daily cap, which resets at 00:00 UTC. …"
}
}Filtra por code, no por message: los mensajes pueden cambiar de redacción, los códigos se mantienen. type sigue el de OpenAI, así que los SDK lanzan la excepción que esperas.
Todos los códigos
| Estado | Código | Cuándo | Solución |
|---|---|---|---|
| 401 | missing_key | No se envió ninguna clave. | Envíala como Authorization: Bearer sk-nokeep-…. Crea una en la consola, o prueba primero sk-nokeep-test. |
| 401 | invalid_key | La clave es incorrecta o fue revocada. | Vuelve a copiar la clave de donde la guardaste; la consola solo muestra sus últimos cuatro caracteres. Si la perdiste, crea una nueva. |
| 403 | account_frozen | Las funciones de pago están pausadas en la cuenta a la que pertenece la clave. | Escríbenos desde la página de contacto. |
| 429 | rate_limited | La clave envió más de 120 solicitudes en un minuto (20 para la clave de prueba, por dirección). | Espera los segundos que indica Retry-After y vuelve a intentarlo. |
| 429 | daily_cap | La llamada podría superar el tope diario de la clave. | Sube el tope en la consola, baja max_tokens o espera a las 00:00 UTC (Retry-After dice cuánto falta). |
| 402 | insufficient_credits | Los créditos comprados de la cuenta no alcanzan para esta llamada. | Recarga desde $5 en la consola, o baja max_tokens. Los créditos de un plan se quedan en la app. |
| 400 | invalid_json | El cuerpo no es un objeto JSON. | Envía Content-Type: application/json y un objeto JSON. |
| 413 | too_large | La solicitud pesa más de 12 MB. | Envía las imágenes como enlaces en vez de data URLs, o envía menos a la vez. |
| 404 | model_not_found | El id del modelo no es uno de los nuestros. | GET /v1/models lista los ids. Revisa si hay un error de escritura o si falta -uncensored. |
| 400 | invalid_messages | messages falta o está vacío, es demasiado largo, tiene un rol desconocido, o un mensaje de herramienta no tiene tool_call_id. | Envía de 1 a 2000 mensajes, cada uno con rol system, developer, user, assistant o tool. |
| 400 | unsupported_n | n es mayor que 1. | Envía una solicitud por cada respuesta que quieras. |
| 400 | invalid_reasoning_effort | El modelo no acepta ese reasoning_effort. | DeepSeek acepta none, low, high o max. GLM acepta low o high. |
| 400 | unsupported_tool_choice | GLM recibió una función con nombre o "required" como tool_choice. | Envía auto o none a GLM; elige sus propias herramientas. DeepSeek acepta todas las formas. |
| 400 | unsupported_input | Una parte del contenido es de un tipo que el modelo no puede leer. | Envía las imágenes a DeepSeek; GLM solo lee texto. |
| 400 | too_many_images | Más de diez imágenes en una solicitud. | Envía diez como máximo. |
| 422 | hard_limit | La solicitud cruza uno de los límites duros de los términos. | No se cobró nada. Quita el mensaje del historial que reenvías, o la siguiente llamada también se detendrá. |
| 400 | rejected | El modelo no pudo aceptar la solicitud tal como se envió. | Compara los parámetros con la lista del modelo en Modelos. No se cobró nada. |
| 503 | busy | El modelo está ocupado. | Reintenta tras los segundos de Retry-After. No se cobró nada. |
| 503 | model_unavailable | El modelo está fuera de línea de nuestro lado. | Usa el otro modelo por ahora; la página de estado muestra cuándo vuelve. |
| 502 | upstream_error | El modelo falló antes de escribir una palabra. | Reintenta en un momento. No se cobró nada. |
| 404 | not_found | La ruta no existe. | La API sirve GET /v1/models, GET /v1/models/{id}, GET /v1/status y POST /v1/chat/completions. |
| 404 | api_closed | La API está apagada. | Vuelve a intentarlo más tarde. |
| En un stream | Código | Cuándo | Solución |
|---|---|---|---|
| — | stream_cut | El modelo se detuvo antes de terminar, a mitad del stream. | Se cobra lo que escribió, nada más. Reintenta para obtener el resto, o continúa desde lo que llegó. |
Cuáles reintentar
- Reintenta
429 rate_limited,503 busyy502 upstream_error, después de los segundos deRetry-Aftercuando los haya. - No reintentes los
400,401,402,404ni422: la misma petición recibe la misma respuesta. - Un
429 daily_capespera a las 00:00 UTC. Sube el límite en su lugar.