Linework Developers
FR
Obtenir l'accès

Concepts

Erreurs

Les erreurs utilisent les codes de statut HTTP standard et ont toujours la même structure JSON.

Format des erreurs#

{
  "error": {
    "code": "INSUFFICIENT_SCOPE",
    "message": "This API key does not have the scope posts:write"
  }
}
  • code est stable : utilisez-le dans votre code.
  • message est destiné aux humains et peut changer.
  • Certaines erreurs ajoutent des champs supplémentaires à côté de code et message (par exemple le champ invalide d'une erreur de validation).

Codes d'erreur#

StatutCodeSignification · que faire
400VALIDATION_ERRORUn paramètre ou un champ du corps est manquant ou invalide. Corrigez la requête ; ne la renvoyez pas telle quelle.
400INVALID_JSONLe corps n'est pas un JSON valide. Envoyez Content-Type: application/json et un corps valide.
401INVALID_API_KEYClé absente, mal formée ou révoquée. Vérifiez l'en-tête Authorization.
403INSUFFICIENT_SCOPELa clé ne dispose pas du scope requis par cet endpoint. Créez une clé avec les bons scopes.
403DEVELOPER_ACCESS_REVOKEDL'accès développeur de ce compte a été suspendu ou révoqué. Contactez developers@linework.app.
403PROFILE_INCOMPLETEAjoutez une photo de profil et une couverture au compte avant d'utiliser les endpoints d'écriture.
403CHAT_NOT_ALLOWEDLa règle anti-spam n'autorise pas ce message : la personne ne vous a pas écrit et ne vous suit pas.
403CHAT_BLOCKEDL'un de vous a bloqué l'autre. Ne réessayez pas.
403STORE_BLOCKEDCette boutique vous a bloqué.
403USER_UNAVAILABLEL'utilisateur n'est pas disponible (bloqué, privé ou suspendu).
403FORBIDDENL'action n'est pas autorisée pour ce compte (par exemple modifier le post de quelqu'un d'autre).
404NOT_FOUNDLa ressource n'existe pas ou vous ne pouvez pas la voir.
409CONFLICTLa requête est en conflit avec l'état actuel (par exemple expédier deux fois une commande).
413PAYLOAD_TOO_LARGELe corps ou le fichier importé est trop volumineux. Consultez les limites des médias dans Publier avec des médias.
429RATE_LIMITEDTrop de requêtes, ou un quota journalier est épuisé. Attendez le délai indiqué par Retry-After. Consultez Limites de débit.
500INTERNAL_ERRORUn problème est survenu de notre côté. Réessayez plus tard avec un backoff.

De nouveaux codes peuvent être ajoutés au fil du temps : traitez un code inconnu selon la signification générique de son statut HTTP.

Réessayer ou non ?#

StatutRéessayer ?
400, 401, 403, 404, 409, 413Non. Corrigez d'abord la requête, la clé ou le compte.
429Oui, après Retry-After.
500, 502, 503, 504Oui, avec un backoff exponentiel. Pour les écritures non idempotentes (par exemple POST /posts), vérifiez d'abord que l'action n'a pas déjà eu lieu.

Exemple de gestionnaire#

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')}")