Skip to content
Langue: Français

API pour les développeurs

Format et codes d’erreur de l’API

Mis à jour le 1 novembre 2026 6 min de lecture

Comment sont structurées les réponses d’erreur de l’API LinkHarbor, ce que signifient les principaux codes et comment votre code doit y réagir.

Chaque réponse d’erreur de l’API a le même format. Votre code doit se fier au code d’erreur du champ error, pas au texte de message – le code reste stable, alors que le texte peut changer et est traduit dans la langue du compte.

Structure d’une réponse d’erreur

Exemple : 422 validation_failed
{
  "error": "validation_failed",
  "message": "Some of the information provided is invalid. Please check and try again.",
  "details": [
    { "field": "title", "reason": "minLength", "message": "…" }
  ],
  "request_id": "6b1f0c2e-…"
}
error
Code lisible par machine, par exemple not_found. Pour la plupart des erreurs, il figure aussi dans l’en-tête X-Error-Code – mais fiez-vous au champ du corps.
message
Description lisible par un humain dans la langue du compte : avec une clé API, celle du propriétaire de l’espace de travail ; avec une application connectée, celle de la personne qui l’a connectée. Sans jeton valide – par exemple pour le 401 du contrôle de jeton –, la langue suit Accept-Language, sinon c’est l’anglais. L’en-tête Content-Language indique la langue utilisée.
details
Présent uniquement s’il y a plus à dire. Pour un 422 issu de la validation des saisies, une liste avec field, reason et message pour chaque problème ; pour un 422 issu de la logique métier et toutes les autres erreurs, un objet, par exemple avec reason, retry_after_sec ou une liste issues. En cas de dépassement de taille, il contient field, reason et limit, et pour 413 request_too_large max_bytes et max_kb. Vérifiez donc si details est une liste.
request_id
L’ID de la requête. Il figure aussi dans l’en-tête X-Request-Id. Indiquez-le quand vous contactez le support.

Exceptions : la réponse 429 rate_limited a le champ retry_after_sec au lieu de details ; avec 429 et 403 insufficient_scope, request_id manque dans le corps. Le 401 du contrôle de jeton et le 422 du contrôle de schéma n’ont pas d’en-tête X-Error-Code ; avec le contrôle de schéma, seul le message de premier niveau est traduit, les textes de details restent en anglais. L’en-tête X-Request-Id est toujours présent.

Les codes les plus importants

HTTPerrorSignificationQue faire
400invalid_jsonLe corps n’est pas du JSON valideVérifiez le JSON
400bad_requestContent-Type erroné ou requête mal forméeDéfinissez Content-Type: application/json
401missing_bearer_tokenPas de jeton dans l’en-tête AuthorizationDéfinissez l’en-tête Authorization: Bearer …
401invalid_tokenJeton expiré ou invalide, ou clé suppriméeRécupérez un nouveau jeton ; si cela ne suffit pas, vérifiez la clé
401invalid_api_keyID ou secret de clé erroné lors de l’échange de jetonVérifiez les identifiants
402plan_limit_reachedLimite de l’offre atteinte, par exemple pour les liens courtsPassez à une offre supérieure ou supprimez des éléments
403insufficient_scopePortée manquante ou endpoint non ouvert aux clés APICréez une clé avec la bonne portée
403forbiddenPas de droit pour cette actionFaites-le dans le tableau de bord
403feature_not_availableFonction non incluse dans l’offreVérifiez l’offre
403block_type_requires_planType de bloc disponible uniquement dans une offre supérieureChoisissez un autre type de bloc ou passez à une offre supérieure
403template_lockedModèle premium non disponible dans l’offre actuelleChoisissez un modèle dans GET /v1/templates/available
403workspace_suspended, workspace_read_only, workspace_grace_expiredEspace de travail bloqué ou en lecture seule à cause d’un paiement en attenteRéglez le paiement dans le tableau de bord
404not_foundLa ressource n’existe pas ou n’appartient pas à votre espace de travailVérifiez l’ID
409conflictConflit général avec l’état actuelRechargez l’état, modifiez la saisie
409workspace_template_in_useLe modèle d’espace de travail est encore utilisé par des pages ; le nombre figure dans details.countPassez les pages à un autre modèle, puis supprimez-le
409handle_taken, slug_takenLe handle ou le slug du lien court est déjà prisChoisissez une autre valeur
409form_in_use, page_not_private, page_not_published, never_publishedConflit avec l’état : formulaire encore sur une page, page non privée ou non publiée, jamais publiéeModifiez l’état, puis réessayez
409page_limit_reached, link_limit_reached, block_limit_reached, form_limit_reached, asset_limit_reached, asset_storage_limit_reached, workspace_template_limit_reachedLimite de quantité ou de stockage de l’offre atteinteSupprimez des éléments ou passez à une offre supérieure
409draft_not_publishableLe brouillon a des problèmes ; la liste figure dans details.issuesCorrigez les problèmes, puis republiez
413request_too_largeCorps plus grand que ce que permet cet endpoint (64 Ko, 1 Mo ou 2 Mo) ; la limite figure dans details.max_kbEnvoyez moins de données par requête, voir Limites de débit
413payload_too_largeFichier téléversé de plus de 10 MoRéduisez la taille du fichier
422validation_failedSaisie invalide ou champ inconnu ; précisions dans detailsCorrigez les champs comme indiqué dans details
422handle_reserved, target_url_invalid, target_url_scheme, target_url_hostHandle réservé, ou URL cible invalide ou non autoriséeChoisissez une autre valeur
422workspace_template_disabledLe modèle d’espace de travail sélectionné est désactivéActivez le modèle sous « Domaines et modèles » ou choisissez-en un autre
422template_css_external, template_section_invalidModèle d’espace de travail : le CSS charge depuis des serveurs externes, ou une section {{#if}}/{{#unless}}/{{#each}} est mal placéeSupprimez les adresses externes, ou fermez la section dans la même balise ou le même texte
422custom_css_externalLe CSS personnalisé charge quelque chose depuis des serveurs externesSupprimez les adresses externes du CSS
429rate_limited, api_key_lockedTrop de requêtes, ou clé verrouillée après des échecsAttendez le temps indiqué par Retry-After ou details.retry_after_sec
500internal_errorErreur inattendueRéessayez plus tard, notez le request_id
503service_unavailableService temporairement indisponibleRéessayez après une pause

Lire les erreurs de saisie

Avec 422 validation_failed, details liste chaque problème séparément : field est le chemin du champ (avec des barres obliques pour les objets imbriqués, par exemple theme_config/button_style), reason est la règle enfreinte, comme required, minLength, maxLength, enum ou additionalProperties. Avec additionalProperties, le message indique quels champs sont inconnus – souvent une faute de frappe dans le nom du champ.

Gestion recommandée dans votre code

  • 400, 413 et 422 : ne réessayez pas, corrigez plutôt la requête
  • 401 invalid_token : récupérez une fois un nouveau jeton et réessayez
  • 403 : ne réessayez pas ; vérifiez la portée, l’offre ou qui a le droit de faire cela
  • 404 : vérifiez l’ID ; après une suppression, c’est normal
  • 409 : rechargez l’état et décidez si l’action est encore nécessaire
  • 429 : attendez le temps indiqué par Retry-After, puis réessayez – voir Limites de débit
  • 500 et 503 : réessayez quelques fois avec des pauses croissantes

Vous n’avez rien trouvé ?

Dites-nous ce dont vous avez besoin, et notre équipe support vous aidera personnellement.

Contacter le support