Linework Developers
ES
Obtener acceso

Conceptos

Errores

Los errores usan códigos de estado HTTP estándar y siempre tienen la misma forma JSON.

Formato de error#

{
  "error": {
    "code": "INSUFFICIENT_SCOPE",
    "message": "This API key does not have the scope posts:write"
  }
}
  • code es estable: úsalo en tu código.
  • message está pensado para personas y puede cambiar.
  • Algunos errores añaden campos adicionales junto a code y message (por ejemplo, el campo no válido de un error de validación).

Códigos de error#

EstadoCódigoSignificado · qué hacer
400VALIDATION_ERRORFalta un parámetro o un campo del cuerpo, o no es válido. Corrige la solicitud; no la reintentes tal cual.
400INVALID_JSONEl cuerpo no es JSON válido. Envía Content-Type: application/json y un cuerpo válido.
401INVALID_API_KEYClave ausente, con formato incorrecto o revocada. Revisa el header Authorization.
403INSUFFICIENT_SCOPELa clave no tiene el scope que necesita este endpoint. Crea una clave con los scopes adecuados.
403DEVELOPER_ACCESS_REVOKEDEl acceso de desarrollador de esta cuenta se ha suspendido o revocado. Escribe a developers@linework.app.
403PROFILE_INCOMPLETEAñade una foto de perfil y una portada a la cuenta antes de usar los endpoints de escritura.
403CHAT_NOT_ALLOWEDLa regla antispam no permite este mensaje: la persona no te ha escrito y no te sigue.
403CHAT_BLOCKEDUno de los dos ha bloqueado al otro. No reintentes.
403STORE_BLOCKEDEsta tienda te ha bloqueado.
403USER_UNAVAILABLEEl usuario no está disponible (bloqueado, privado o suspendido).
403FORBIDDENLa acción no está permitida para esta cuenta (por ejemplo, editar el post de otra persona).
404NOT_FOUNDEl recurso no existe o no puedes verlo.
409CONFLICTLa solicitud entra en conflicto con el estado actual (por ejemplo, enviar un pedido dos veces).
413PAYLOAD_TOO_LARGEEl cuerpo o el archivo subido es demasiado grande. Consulta los límites de contenido multimedia en Publicar con contenido multimedia.
429RATE_LIMITEDDemasiadas solicitudes, o se ha agotado una cuota diaria. Espera lo indicado en Retry-After. Consulta Límites de solicitudes.
500INTERNAL_ERRORAlgo ha fallado por nuestra parte. Reintenta más tarde con backoff.

Con el tiempo pueden añadirse códigos nuevos: trata un código desconocido con el significado genérico de su estado HTTP.

¿Reintentar o no?#

Estado¿Reintentar?
400, 401, 403, 404, 409, 413No. Primero corrige la solicitud, la clave o la cuenta.
429Sí, después de Retry-After.
500, 502, 503, 504Sí, con backoff exponencial. En las escrituras que no son idempotentes (por ejemplo, POST /posts), comprueba primero que la acción no se haya realizado ya.

Ejemplo de gestión de errores#

const res = await fetch(url, options);
if (!res.ok) {
  const { error } = await res.json().catch(() => ({ error: { code: "UNKNOWN" } }));
  switch (error.code) {
    case "RATE_LIMITED": /* wait Retry-After, then retry */ break;
    case "INVALID_API_KEY":
    case "DEVELOPER_ACCESS_REVOKED": /* stop the bot and alert someone */ break;
    case "CHAT_NOT_ALLOWED": /* skip this user */ break;
    default: throw new Error(`${res.status} ${error.code}: ${error.message}`);
  }
}
r = s.post(url, json=body, timeout=30)  # s = requests.Session() with the Authorization header
if not r.ok:
    err = r.json().get("error", {})
    code = err.get("code")
    if code == "RATE_LIMITED":
        ...  # wait Retry-After, then retry
    elif code in ("INVALID_API_KEY", "DEVELOPER_ACCESS_REVOKED"):
        ...  # stop the bot and alert someone
    elif code == "CHAT_NOT_ALLOWED":
        ...  # skip this user
    else:
        raise RuntimeError(f"{r.status_code} {code}: {err.get('message')}")