# Codes d’erreur

Toutes les erreurs suivent la RFC 9457 (application/problem+json). Votre code s’appuie sur le champ code, stable ; le titre est traduit et peut évoluer.

- `unauthenticated`: Jeton absent, invalide ou expiré.
- `forbidden`: Action refusée pour ce jeton.
- `token.missing_scope`: Le jeton ne porte pas le scope requis.
- `api.not_in_plan`: L'API n'est pas incluse dans votre offre.
- `api.write_not_in_plan`: L'écriture par l'API n'est pas incluse dans votre offre.
- `plan_limit`: Limite de votre offre atteinte.
- `rate_limited`: Débit de votre offre dépassé, réessayez plus tard.
- `not_found`: Ressource introuvable.
- `method_not_allowed`: Méthode HTTP non prise en charge par cette route.
- `validation_failed`: La requête contient des valeurs invalides.
- `pagination.invalid_cursor`: Curseur de pagination invalide, ou émis pour une autre requête.
- `idempotency.key_required`: Cette écriture exige un en-tête Idempotency-Key.
- `idempotency.key_invalid`: En-tête Idempotency-Key invalide (1 à 255 caractères ASCII visibles).
- `idempotency.key_reused`: Cette Idempotency-Key a déjà servi à une autre requête.
- `idempotency.in_progress`: Une requête portant cette Idempotency-Key est encore en cours.
- `project.locked`: Projet en lecture seule : votre offre ne couvre plus ce projet. Rien n’y est exécuté, tout y reste lisible.
- `project.not_configured`: Projet incomplet : déclarez son modèle d’activité et créez une campagne avant de lancer un crawl.
- `crawl.already_running`: Un crawl est déjà en cours pour cette équipe ; il s’exécute un crawl à la fois.
- `crawl.already_finished`: Ce crawl est déjà terminé.
- `crawl.target_refused`: La cible de la campagne n’est pas une adresse publique.
- `crawl.no_baseline`: Aucun crawl comparable comme référence : un crawl tronqué n’en est jamais une.
- `recommendations.no_data`: Aucune source de données pour ce projet : lancez un crawl, ou branchez Search Console ou vos journaux.
- `export.crawl_not_finished`: Ce crawl n’est pas terminé : son rapport serait incomplet.
- `export.not_ready`: L’export n’est pas encore prêt.
- `export.expired`: L’export a expiré ; demandez-en un nouveau.
- `positions.not_configured`: Le suivi de positions n’est pas configuré : choisissez d’abord le marché suivi.
- `keywords.project_limit`: Plafond de mots-clés suivis atteint pour ce projet.
- `keywords.not_tracked`: Ce mot-clé n’est pas suivi : ajoutez-le d’abord au suivi.
- `keywords.paused`: Ce mot-clé est suspendu : reprenez-le avant de le vérifier.
- `keywords.already_checked_today`: Ce mot-clé a déjà été vérifié aujourd’hui ; une vérification immédiate par mot-clé et par jour.
- `bad_request`: Requête mal formée.
- `conflict`: La requête entre en conflit avec l'état de la ressource.
- `payload_too_large`: Corps de requête trop volumineux.
- `unsupported_media_type`: Type de contenu non pris en charge.
- `service_unavailable`: Service momentanément indisponible.
- `internal_error`: Erreur interne. Elle a été journalisée.

Les refus de palier forment une famille : plan_limit suivi de la clé de l’offre concernée, par exemple plan_limit.projects.max. La réponse porte aussi entitlement et upgrade_to.
