Errores
Todos los errores comparten la misma forma JSON, con un código estable pensado para programar contra él.
Forma del error
El campo code es estable y no cambiará dentro de v1; message es copy para humanos y puede cambiar. Algunos errores añaden campos extra (p. ej. permission o issues).
{ "error": { "code": "…", "message": "…" } }Códigos
unauthorizedHTTP 401Key ausente, malformada, desconocida, revocada o caducada. La respuesta es idéntica en todos los casos: no se puede sondear si una key existió.
missing_permissionHTTP 403La key es válida pero no tiene el permiso que exige el endpoint. El campo permission indica cuál falta.
forbiddenHTTP 403Operación reservada (p. ej. moderar comentarios ajenos).
not_foundHTTP 404El recurso no existe o pertenece a otro proyecto — indistinguibles a propósito.
validation_errorHTTP 400Cuerpo o query inválidos. issues detalla campo a campo. Los cuerpos son estrictos: campos desconocidos también fallan.
conflictHTTP 409Violación de unicidad (p. ej. etiqueta duplicada).
dependency_cycleHTTP 409La dependencia dejaría a dos tareas esperándose entre sí. Es un error propio precisamente para no confundirlo con una falta de permisos.
storage_unavailableHTTP 503El despliegue no tiene almacenamiento configurado, así que los adjuntos están desactivados. No es un fallo de tu petición.
rate_limitedHTTP 429Límite superado. Respeta la cabecera Retry-After.
internal_errorHTTP 500Error inesperado. Sin detalles internos, a propósito.
Errores de validación
Un cuerpo o unos parámetros inválidos responden 400 con el detalle campo a campo en issues. Recuerda que los cuerpos son estrictos: un campo desconocido también es un error de validación (ver Convenciones).
{
"error": {
"code": "validation_error",
"message": "Petición no válida.",
"issues": [{ "path": "title", "message": "El título es obligatorio." }]
}
}