Cuando algo se rechaza, el motivo llega como un código corto legible por máquina. La consola convierte la mayoría en una notificación emergente en el idioma de su consola; un código que todavía no conoce muestra el mensaje propio de la API, que está en inglés. La API los devuelve como JSON.
{
"detail": {
"code": "OFFER_UNAVAILABLE",
"message": "This offer is no longer available"
}
}
Algunos códigos llevan campos adicionales junto a code y message: DISK_TOO_LARGE devuelve max_disk_gb y MACHINE_DISK_EXHAUSTED devuelve available_disk_gb, de modo que un cliente puede limitar el control deslizante y reintentar sin una segunda ida y vuelta.
Esos dos no son intercambiables, y limitar al equivocado produce un bucle infinito. max_disk_gb es el disco total de la máquina; available_disk_gb es lo que queda después de los demás inquilinos y de una reserva de 50 GB para el anfitrión. Por eso una máquina puede pasar DISK_TOO_LARGE y aun así responder MACHINE_DISK_EXHAUSTED — incluso una vacía, porque la reserva nunca se vende. Limite a available_disk_gb cuando lo reciba.
Autenticación y alcance de la organización
| Estado | Código | Causa | Qué hacer |
|---|
| 401 | TOKEN_INVALID | Falta el encabezado Authorization, el token está mal formado, la clave de API es desconocida o fue revocada, o se envió una clave de API a un endpoint de cuenta | Envíe un token bearer válido. Los endpoints de cuenta como /v1/me y /v1/ssh-keys necesitan una sesión iniciada, no una clave shk_ |
| 401 | TOKEN_EXPIRED | El token de sesión pasó su fecha de expiración | Inicie sesión de nuevo. Para scripts desatendidos, use una clave de API en su lugar |
| 403 | NOT_A_MEMBER | X-Org-Id nombra una organización a la que usted no pertenece | Quite el encabezado para usar su organización personal, o pida una invitación a un administrador |
| 403 | ORG_MISMATCH | X-Org-Id no coincide con la organización en la que se creó la clave de API | Quite el encabezado, o use una clave que pertenezca a esa organización |
| 403 | ADMIN_REQUIRED | Una acción reservada a administradores —el pago, las invitaciones, la gestión de miembros, las claves de API del equipo— intentada como miembro o con una clave de API | Pídaselo a un administrador, o repita la acción desde una sesión iniciada de administrador |
| 400 | INVALID_ORG_ID | X-Org-Id no es un id válido | Copie el id de GET /v1/orgs |
| 403 | MFA_REQUIRED | Su cuenta tiene inscrita la verificación en dos pasos, y el token de sesión no ha completado el segundo paso | Vuelva a iniciar sesión e introduzca el código de su aplicación de autenticación. La consola lo lleva a ese paso por sí misma. Las claves de API no se ven afectadas |
| 503 | AUTH_UNAVAILABLE | La API no puede comprobar su inicio de sesión en este momento: no pudo leer las claves de firma o el estado de la verificación en dos pasos | Reintente en breve. Su sesión sigue siendo válida |
Límites en cada solicitud
| Estado | Código | Causa | Qué hacer |
|---|
| 429 | RATE_LIMITED | Demasiadas solicitudes de un mismo llamante: un usuario con sesión iniciada, una clave de API o, para las solicitudes anónimas, una dirección IP. Cada solicitud a /v1 cuenta para un máximo de 600 por minuto; POST, PUT, PATCH y DELETE cuentan además para 60 por minuto. Una dirección IP cuyas solicitudes se rechazan como no autenticadas más de 60 veces por minuto también recibe este código, para cada credencial suya que todavía no haya funcionado | Espere los segundos del encabezado Retry-After (también retry_after_s en el cuerpo) y luego reintente. /v1/health nunca se limita |
| 413 | PAYLOAD_TOO_LARGE | El cuerpo de la solicitud es mayor de lo que acepta el endpoint: 1 MiB en la mayoría de los endpoints, 4 MiB bajo /v1/templates. La respuesta incluye limit_bytes | Envíe un cuerpo más pequeño. El readme y el script de inicio de una plantilla tienen sus propios topes, muy por debajo de eso |
Despliegue
| Estado | Código | Causa | Qué hacer |
|---|
| 402 | INSUFFICIENT_BALANCE | Su saldo no cubre una hora del consumo de la organización con esta instancia en marcha —su GPU y su disco, más la GPU y el disco de las instancias en ejecución, iniciándose o en creación y el disco de las detenidas— cuando la despliega o la inicia. Estar por encima de cero no basta. La respuesta incluye balance_micro y required_micro | Agregue créditos. Solo un administrador puede recargar |
| 409 | OFFER_UNAVAILABLE | La última unidad libre de esa forma fue tomada entre el momento en que usted la abrió y el momento en que desplegó, o por otro despliegue mientras se reservaba el suyo | Vuelva al mercado y elija otra oferta. El recuento de una tarjeta es una instantánea; el despliegue es lo que decide |
| 404 | OFFER_NOT_FOUND | A GET /v1/offers/{id} se le pasó un id que no existe o que fue retirado del catálogo. Un despliegue contra una oferta desconocida devuelve OFFER_UNAVAILABLE en su lugar | Vuelva a listar las ofertas y use un id vigente |
| 422 | DISK_TOO_LARGE | El disk_gb solicitado es mayor que el total de la máquina. La respuesta incluye max_disk_gb | Solicite como máximo max_disk_gb, o elija una máquina con un disco más grande |
| 409 | MACHINE_IN_MAINTENANCE | La máquina está reservada para desconectarse demasiado pronto como para arrancar una instancia en ella. La respuesta incluye next_maintenance | Elija otra máquina, o vuelva después de la ventana. Una ventana más lejana no bloquea el despliegue: se muestra en la oferta |
| 409 | MACHINE_DISK_EXHAUSTED | El disco de la máquina ya está comprometido con otros inquilinos. Lleva varios a la vez, y el disco se vende contra lo que queda, no contra el total — así que esto puede seguir a un disk_gb que superó DISK_TOO_LARGE. La respuesta incluye available_disk_gb y requested_disk_gb | Reintente en available_disk_gb o por debajo, o elija otra máquina. available_disk_gb puede ser 0 |
| 422 | OFFER_NOT_VM_CAPABLE | Una plantilla con modo de lanzamiento vm se dirigió a una máquina que no puede ejecutar máquinas virtuales | Despliegue la plantilla en una oferta con capacidad de VM, o elija una plantilla en otro modo de lanzamiento |
| 404 | TEMPLATE_NOT_FOUND | El id de la plantilla no existe, o la plantilla fue eliminada | Use una plantilla de la galería, o un hash_id que le hayan dado |
| 404 | SSH_KEY_NOT_FOUND | El ssh_key_id no es una de sus claves | Liste GET /v1/ssh-keys y use un id de su propia cuenta. Las claves pertenecen a un usuario, no a una organización |
| 402 | PAYMENTS_FROZEN | Hay una disputa de pago abierta contra la organización. Desplegar e iniciar una instancia detenida quedan en pausa hasta que se cierre, y mientras tanto las instancias detenidas liberan sus GPU, donde su máquina lo permite | Espere a que se cierre la disputa. Consulte Transacciones y gasto y Mientras haya una disputa de pago abierta |
| 409 | INSTANCE_LIMIT_REACHED | La organización ya tiene 25 instancias que no están destruidas. Las detenidas y las que están en error cuentan para el límite, no solo las que se ejecutan. La respuesta incluye limit | Destruya las instancias que ya no necesite —detener una no libera un cupo— y vuelva a desplegar |
| 422 | TEMPLATE_COMING_SOON | La imagen de la plantilla aún no se ha publicado, así que no se puede lanzar | Elija otra plantilla. La consola muestra estas plantillas como aún no disponibles |
| 422 | TEMPLATE_CUDA_TOO_NEW | La plantilla fija una pila de CUDA más antigua —su cuda_max— y la máquina informa una versión de CUDA más nueva. El contenedor arrancaría, pero su framework no tiene kernels para esa GPU | Elija una máquina cuya versión de CUDA esté en el techo de la plantilla o por debajo, o una plantilla hecha para GPU más nuevas |
| 422 | TEMPLATE_ARCH_UNSUPPORTED | La plantilla declara una arquitectura distinta de x86_64. Todos los hosts de Superheat son x86_64 | Use una imagen amd64 |
| 409 | OFFER_NOT_PINNABLE | La máquina detrás de la oferta no está registrada en el plano de control, así que el despliegue no puede fijarse a ella. Esas ofertas se ocultan del mercado, así que esto suele indicar un id de oferta obsoleto | Vuelva a listar las ofertas y elija otra |
| 422 | TEMPLATE_REQUIRES_OWNER | La plantilla descarga de un registro privado, y solo la organización propietaria puede desplegarla: su contraseña de registro nunca se usa en nombre de otros | Duplique la plantilla, introduzca sus propias credenciales de registro en la copia y despliegue esa copia |
Todos los códigos de esa tabla se devuelven antes de conservar nada, así que un rechazo no crea nada ni cuesta nada.
Acciones sobre la instancia
| Estado | Código | Causa | Qué hacer |
|---|
| 404 | INSTANCE_NOT_FOUND | El id de la instancia no existe en la organización a la que está dirigida la solicitud | Revise el id, y revise que esté en la organización correcta |
| 409 | INVALID_STATE | La acción no es válida desde el estado actual de la instancia: detener algo que ya se está deteniendo, iniciar algo que ya está en ejecución. Destruir está permitido desde todos los estados salvo destroyed | Espere a que la instancia llegue a running o stopped y luego reintente. El campo allowed_actions de la instancia lista lo que es válido ahora. Consulte Estados de la instancia |
| 409 | HOST_UNREACHABLE | Inició una instancia detenida, y la máquina en la que vive no está conectada en este momento. La instancia sigue stopped | Iníciela de nuevo más tarde |
| 409 | START_REFUSED | El host rechazó reanudar la instancia, o ya no conserva su carga de trabajo; el mensaje dice cuál de las dos. La instancia sigue stopped | Si el host ya no conserva la carga de trabajo, destruya la instancia y vuelva a desplegar. Si no, reintente más tarde |
| 409 | CAPACITY_UNAVAILABLE | Inició una instancia cuyas GPU se liberaron —el saldo llegó a cero, o una disputa de pago congeló los pagos— y otro cliente está usando una de ellas ahora. Un inicio tiene que recuperar las mismas GPU en la misma máquina. La instancia sigue stopped, con su disco | Reintente más tarde. Si no puede esperar, copie sus datos y destrúyala. Consulte Detener vs. destruir |
| 503 | START_UNAVAILABLE | La reanudación no pudo completarse en este momento. La instancia sigue stopped; si la reanudación termina llegando, pasa a running por su cuenta | Reintente en breve |
Por qué falló una instancia
Estos no son rechazos de una petición: son el error_code que lleva una instancia cuando cae en error, o cuando una detención o un inicio no se completó y la instancia volvió a running o stopped. La página de la instancia muestra la explicación en el idioma de su consola —bajo Qué salió mal en una instancia con error, y bajo La última acción no se completó en una en ejecución o detenida—, con el código debajo para que pueda citarlo al soporte. En cualquier otro estado la página oculta estos campos, porque describen un estado anterior. En la API son error_code y error_message de la instancia.
Códigos que pone la propia plataforma. La explicación sustituye al error_message en inglés de la API:
error_code | Lo que dice la consola |
|---|
provision_failed | El planificador no aceptó este despliegue. No se cobró nada: destrúyela e inténtalo de nuevo. |
provision_lost | El despliegue nunca llegó al planificador. No se cobró nada: destrúyela e inténtalo de nuevo. |
provision_timed_out | La carga de trabajo nunca se colocó en su máquina. Destrúyela e inténtalo de nuevo. |
dispatch_job_missing | El planificador ya no tiene la carga de trabajo de esta instancia. Destrúyela y despliégala de nuevo. |
stop_timed_out | La máquina no confirmó la detención. La instancia sigue en ejecución y facturando; se está reintentando detenerla. |
start_timed_out | La máquina no confirmó la reanudación. Sigue detenida: intenta iniciarla de nuevo. |
workload_completed | La carga de trabajo terminó por sí sola. Su GPU se liberó: destruye la instancia. |
machine_unreachable | La máquina de esta instancia no estaba conectada cuando se inició. Sigue detenida: inténtalo más tarde. |
start_refused | La máquina se negó a reanudar esta instancia. Sigue detenida. |
workload_gone | La máquina ya no tiene la carga de trabajo de esta instancia. Destrúyela y despliégala de nuevo. |
gpus_unavailable | Las GPU que usaba esta instancia en su máquina las está usando otra persona ahora mismo. Sigue detenida con su disco: intenta iniciarla más tarde o destrúyela. |
dispatch_unavailable | No se pudo contactar con el planificador para reanudar esta instancia. Sigue detenida: inténtalo de nuevo en breve. |
gateway_unavailable | No se pudo contactar con la máquina para reanudar esta instancia. Sigue detenida: inténtalo de nuevo en breve. |
Códigos que el planificador registra sobre la carga de trabajo en su máquina. La consola muestra la explicación y, debajo, como Detalles, el error_message del propio host, que a menudo es la razón exacta: un estado de salida, una imagen que falta:
error_code | Lo que dice la consola |
|---|
workload_failed | El contenedor falló en su máquina. |
workload_lost | La máquina perdió el rastro del contenedor. |
workload_exit_nonzero | El contenedor terminó con un error. |
workload_terminal | La carga de trabajo ya había terminado en su máquina. |
start_timeout | El contenedor no arrancó a tiempo. Una imagen muy grande puede tardar en descargarse más de lo permitido. |
deadline_exceeded | La carga de trabajo alcanzó su límite de tiempo. |
machine_lost | La máquina se desconectó. |
machine_gone | La máquina salió de la flota. |
unknown_to_gateway | La máquina no tiene registro de esta carga de trabajo. |
placement_error | No se pudo colocar la carga de trabajo en una máquina. |
drain | La máquina se retiró del servicio por mantenimiento. |
manual_reschedule | Soporte trasladó esta carga de trabajo a otra máquina. |
image_not_provisioning_capable | Esta imagen no se puede iniciar con el modo de arranque de esta plantilla. |
launch_mode_unsupported | Ninguna máquina admite el modo de arranque de esta plantilla. |
vm_not_supported | Esta máquina no puede ejecutar máquinas virtuales. |
Un código que no está en ninguna de las dos tablas se muestra igualmente, tal cual, con el mensaje que envió la API. Qué hacer a continuación está en Solución de problemas.
Explorar ofertas
| Estado | Código | Causa | Qué hacer |
|---|
| 422 | INVALID_CURSOR | El cursor de GET /v1/offers no es uno que haya emitido la API, o se emitió para otro sort | Devuelva sin cambios el next_cursor de la página anterior con el mismo sort, u omítalo para empezar de nuevo. Consulte Ofertas |
Plantillas
| Estado | Código | Causa | Qué hacer |
|---|
| 403 | TEMPLATE_IMMUTABLE | Intentó editar o eliminar una plantilla del sistema curada por Superheat | Duplíquela primero y luego edite su copia |
| 409 | TEMPLATE_NAME_TAKEN | Su organización ya tiene una plantilla con ese nombre, sin distinguir mayúsculas y minúsculas | Elija otro nombre |
| 404 | TEMPLATE_NOT_FOUND | El id o el hash_id no resuelve a una plantilla que usted pueda ver | Confirme que el enlace compartido esté completo y vigente: el hash_id cambia cuando cambia la receta de lanzamiento |
| 422 | INVALID_TAB | El parámetro de consulta tab del listado de plantillas no es una de las pestañas de la galería | Use un valor de pestaña admitido |
| 422 | INVALID_CURSOR | El cursor del listado de plantillas no es uno que haya emitido la API | Devuelva sin cambios el next_cursor de la página anterior, u omítalo para empezar de nuevo |
| 409 | PUBLIC_TEMPLATE_LIMIT_REACHED | Su organización ya tiene 50 plantillas públicas. La respuesta incluye limit | Haga privada una de ellas, o elimine una, antes de publicar otra |
Claves SSH
| Estado | Código | Causa | Qué hacer |
|---|
| 422 | INVALID_SSH_KEY | El valor no es una línea de clave pública OpenSSH, el material de la clave no es base64 válido, o el tipo no está admitido | Pegue todo el contenido del archivo .pub, en una sola línea, empezando por el tipo de clave. Consulte Tipos de clave admitidos |
| 409 | DUPLICATE_SSH_KEY | Ya agregó una clave con la misma huella digital | Use la clave que ya tiene, o elimine primero la entrada anterior |
| 404 | SSH_KEY_NOT_FOUND | El id de la clave no es suyo | Las claves son por usuario. La clave de otro miembro nunca es visible para usted |
Equipo e invitaciones
| Estado | Código | Causa | Qué hacer |
|---|
| 400 | PERSONAL_ORG | Intentó invitar a alguien a una organización personal | Cree primero una organización real y luego invite desde ahí |
| 404 | INVITE_NOT_FOUND | El token de la invitación es incorrecto, la invitación fue retirada, o se envió a una dirección de correo electrónico distinta de aquella con la que tiene iniciada la sesión | Inicie sesión con la dirección invitada, o pida a un administrador un enlace nuevo |
| 410 | INVITE_REVOKED | Quien envió la invitación ya no es administrador de la organización, así que ya no es válida | Pida una invitación nueva a un administrador actual |
| 410 | INVITE_USED | La invitación ya fue aceptada | Pida un enlace de invitación nuevo |
| 410 | INVITE_EXPIRED | La invitación pasó su fecha de expiración | Pida un enlace de invitación nuevo |
| 404 | MEMBER_NOT_FOUND | El usuario no es miembro de esta organización | Actualice la página del equipo: puede que ya lo hayan quitado |
| 400 | LAST_ADMIN | Quitar a ese miembro, o bajarle el rol, dejaría a la organización sin ningún administrador | Ascienda primero a otro miembro a administrador |
Créditos
| Estado | Código | Causa | Qué hacer |
|---|
| 422 | INVALID_AMOUNT | Falta el monto personalizado de la recarga o está fuera del rango aceptado | Elija un paquete de $10, $25 o $100, o un monto personalizado entre $5 y $1,000 |
| 403 | ADMIN_REQUIRED | El pago se intentó desde una cuenta de miembro o con una clave de API | Pida a un administrador de la organización que agregue créditos |
| 422 | INVALID_TIME_ZONE | GET /v1/billing/spend-daily recibió un tz que no es un nombre de zona horaria IANA que la API conozca | Envíe un nombre como Europe/Berlin, u omita tz para usar UTC |
Claves de API
| Estado | Código | Causa | Qué hacer |
|---|
| 404 | API_KEY_NOT_FOUND | El id de la clave no existe en esta organización | Vuelva a listar sus claves y use un id vigente |
| 403 | ADMIN_REQUIRED | Una clave de API intentó crear o revocar otra clave de API, o un miembro intentó gestionar una clave de nivel de equipo | Cree y revoque las claves desde una sesión iniciada |
Solicitudes que no pasan la validación
Una solicitud cuyo cuerpo o cadena de consulta no coincide con el esquema se rechaza antes de llegar a cualquiera de las comprobaciones anteriores. Devuelve 422 con una lista de errores de campo bajo detail en lugar de un code:
{
"detail": [
{
"type": "less_than_equal",
"loc": ["body", "disk_gb"],
"msg": "Input should be less than or equal to 20000"
}
]
}
La entrada loc nombra el campo problemático. Los límites que conviene recordar son disk_gb entre 10 y 20,000, un label de 64 caracteres como máximo, y tail en el endpoint de logs entre 1 y 1,000. En plantillas y despliegues: como máximo 100 entradas de entorno (en la plantilla y en env_overrides), cada valor de hasta 4,096 caracteres; como máximo 32 puertos; como máximo 32 selectores de restricciones; cuda_min, cuda_max y arch de hasta 32 caracteres; limit de los listados de plantillas y de ofertas entre 1 y 200; q del listado de ofertas de hasta 100 caracteres.
Relacionado