Errores
Una sola forma, siempre, incluso en el 500.
code es estable y existe para compararse. message es para quien lee un log y
no es contrato: puede reescribirse en cualquier momento.
{
"error": {
"code": "insufficient_scope",
"message": "This key does not hold library.write.",
"scope": "library.write"
}
}| Código | Estado | Significa |
|---|---|---|
unauthorized | 401 | La petición no trajo identidad alguna: ni llave, ni sesión de este origen. |
forbidden | 403 | La identidad es correcta y una regla lo rechazó igual: un bloqueo, una cuenta privada, un espacio de comentarios cerrado. Cuando el rechazo es uno de esos, el mensaje dice cuál. |
invalid_key | 401 | Desconocida, revocada o expirada. Las tres no se distinguen. |
insufficient_scope | 403 | La llave no tiene el permiso, que viene nombrado en el cuerpo. |
not_found | 404 | No existe, o no es algo que el dueño pueda ver. |
invalid_request | 400 | Falta un campo o no se acepta. El mensaje dice cuál. |
conflict | 409 | Eso ya existe. |
rate_limited | 429 | Trae retry_after en segundos. |
internal | 500 | Algo falló aquí. No se dice nada sobre el esquema. |
unavailable | 503 | Hoy solo en GET /api/v1/arcade/jwks, con reason identity_unavailable: el servidor todavía no tiene las llaves que firman la identidad de Arcade. Inténtalo de nuevo más tarde. |
Otros miembros
Junto a code y message, un rechazo puede traer:
reason: una palabra para actuar, más precisa que elcode, en los rechazos de Arcade y en algunos de la cuenta, comoreauthentication_requiredymfa_required. Un cliente que encuentra uno que no conoce actúa según elcode.field: el campo rechazado, coninvalid_request.detail: una causa más fina, comotoo_largeen unmedia_invalid.retry_after: cuántos segundos esperar, conrate_limited.scope: el permiso que faltó, coninsufficient_scope.check: el resultado de la verificación de URL, cuando se rechaza enviar un lanzamiento de Arcade o ponerlo en vivo.second_factor: conreauthentication_required, en las rutas que aceptan un código en lugar de iniciar sesión de nuevo, si sirve un código de la verificación en dos pasos.
Los rechazos de Arcade, con cada reason, están en la
tabla de rechazos de Arcade.
De dónde viene un rechazo
La mayoría de los rechazos son de la base de datos, no del handler. Una constraint, una columna no nula, un disparador de límite o una política de fila levanta el error, y ese error se traduce a la forma de arriba.
Solo los rechazos levantados a propósito llevan su mensaje hacia fuera.
Cualquier otro responde internal sin decir nada más, porque un mensaje de error
imprevisto es una descripción del esquema.
404 not_found cubre dos casos a propósito: el recurso no existe, y el
recurso existe pero el dueño de la llave no puede verlo. Distinguirlos sería
una forma de preguntar si la lista privada de alguien existe.