Scopes et erreurs
Accordez le moindre privilège et gérez chaque code d'erreur stable de l'API publique.
Accordez le moindre privilège et gérez chaque code d'erreur stable de l'API publique.
Chaque opération de l'API publique exige un scope explicite. Un identifiant valide qui ne dispose pas de ce scope reçoit 403 insufficient_scope ; il n'est jamais élevé silencieusement vers un accès plus large.
Référence des scopes#
| Scope | Autorise |
|---|---|
account:read | Lire le compte authentifié, le forfait, les droits et le résumé du portefeuille |
tickets:read | Lire les tickets de support et leurs messages |
tickets:write | Mettre à jour les tickets, assigner des collègues et ajouter des notes internes ou des réponses aux clients |
team:read | Lire les membres de l'équipe, les invitations en attente et les événements d'audit autorisés |
team:write | Créer ou révoquer des invitations et gérer les rôles des membres de l'équipe autres que le propriétaire |
integrations:read | Consulter les installations et les dépôts de GitHub App autorisés |
integrations:write | Préparer des modifications d'intégration et créer des pull requests en brouillon |
sites:read | Lister et récupérer les sites |
sites:write | Créer, mettre à jour, publier, dépublier et supprimer des sites |
agents:read | Lire les paramètres de l'agent |
agents:write | Mettre à jour le comportement, la langue, la voix et les paramètres d'intégration de l'agent |
knowledge:read | Lister les sources de connaissances et les FAQ |
knowledge:write | Créer, mettre à jour et supprimer des sources de connaissances et des FAQ |
conversations:read | Lister les conversations et récupérer leurs messages |
conversations:write | Prendre le relais d'une conversation : répondre à un visiteur au nom de l'entreprise, mettre l'agent en pause sur cette conversation et la lui rendre |
leads:read | Lister les leads capturés |
leads:write | Créer, mettre à jour, qualifier et intégrer des leads dans le pipeline d'opportunités |
pipeline:read | Lire les étapes, les comptes, les opportunités, les activités, l'attribution et l'état de synchronisation du CRM |
pipeline:write | Configurer les étapes ; créer ou mettre à jour des opportunités et des comptes ; importer ou relancer des résultats CRM |
analytics:read | Lire les événements d'analytique des sites |
connectors:read | Lister l'état des connecteurs sans renvoyer de secrets |
connectors:write | Créer, mettre à jour, activer, désactiver et supprimer des connecteurs |
domains:read | Supprimé. Conservé uniquement pour la compatibilité ; chaque route /domains renvoie 409, car les domaines personnalisés ne sont pas proposés |
domains:write | Supprimé. Conservé uniquement pour la compatibilité ; chaque route /domains renvoie 409 |
broadcasts:read | Lister les diffusions et l'état de leur envoi |
broadcasts:write | Créer des brouillons et mettre en file d'attente l'envoi d'une diffusion |
notifications:read | Lister les notifications du propriétaire |
notifications:write | Marquer les notifications comme lues ou non lues |
monetization:read | Lister les produits de monétisation |
monetization:write | Créer, mettre à jour, activer, désactiver et supprimer des produits |
usage:read | Lire les événements d'utilisation mesurée |
webhooks:read | Lister les endpoints de webhook et l'état des livraisons |
webhooks:write | Créer et supprimer des endpoints de webhook |
Utilisez des scopes en lecture pour les tâches de reporting. N'ajoutez un scope en écriture que si l'intégration effectue réellement cette modification. Par exemple, un export de leads nécessite normalement sites:read et leads:read, et non sites:write ou agents:write.
Échecs liés aux scopes#
{
"error": {
"code": "insufficient_scope",
"message": "The API key does not grant the required scope.",
"details": { "required": ["sites:write"] },
"request_id": "6c0b2f2e-..."
}
}Ajoutez le scope manquant à la clé dans Paramètres → Développeur → Modifier, ou créez une clé de remplacement et mettez à jour le secret côté serveur. La modification change le nom et les scopes de la clé sur place ; son expiration et son jeton restent identiques. Les clés émises via OAuth ne peuvent pas être modifiées ; reconnectez l'application pour changer les autorisations qui lui ont été accordées.
Enveloppe d'erreur#
Toutes les erreurs de l'API utilisent la même structure de premier niveau :
type ApiError = {
error: {
code: string;
message: string;
details?: unknown;
request_id: string;
};
};Basez votre logique sur error.code, et non sur le message en anglais. Les messages peuvent être améliorés sans changement de version. Consignez error.request_id et l'en-tête de réponse x-request-id avec le nom de l'opération, le statut et le numéro de la tentative, mais ne consignez jamais l'en-tête d'autorisation ni les secrets de la requête.
Référence des statuts et des codes#
| HTTP | Code stable | Signification | Réponse habituelle |
|---|---|---|---|
400 | invalid_request | La validation a échoué ou un champ n'est pas pris en charge | Corrigez les champs indiqués dans details ; ne réessayez pas avec les mêmes données |
400 | invalid_json | Le corps n'est pas un objet JSON ou contient du JSON invalide | Sérialisez un seul objet JSON valide |
401 | authentication_required | L'en-tête Bearer est absent | Joignez un identifiant côté serveur |
401 | invalid_api_key | La clé est invalide, expirée ou révoquée, ou son propriétaire n'existe plus | Remplacez la clé ou effectuez-en la rotation |
403 | subscription_required | Le propriétaire n'a pas de forfait payant actif | Rétablissez l'abonnement avant de réessayer |
403 | insufficient_scope | L'identifiant ne dispose pas du scope requis pour l'opération | Créez un identifiant de remplacement au moindre privilège |
403 | account_paused | L'accès à l'API est suspendu pour ce compte | Reprenez l'accès à l'API ou contactez le propriétaire du compte |
404 | not_found | L'endpoint ou la ressource du compte est introuvable | Vérifiez le chemin et l'ID appartenant au tenant |
409 | conflict | L'état actuel de la ressource empêche l'action | Lisez l'état actuel avant de réessayer |
413 | payload_too_large | Le corps JSON dépasse la limite de 256 Ko par requête | Envoyez un corps plus petit ; répartissez les contenus volumineux sur plusieurs requêtes |
415 | invalid_request | Le corps de la requête de modification n'est pas de type application/json | Envoyez Content-Type: application/json |
429 | rate_limit_exceeded | Le quota d'une minute du forfait pour cette clé est épuisé | Attendez le délai indiqué par Retry-After et appliquez un jitter |
500 | internal_error | La requête n'a pas pu être traitée | Réessayez une opération sûre ou idempotente et signalez l'ID de requête |
503 | outcome_unknown | Une modification a peut-être abouti, mais son résultat n'a pas pu être enregistré ; details.retryable vaut false | Ne réessayez pas. Lisez la ressource pour vérifier si la modification a eu lieu ; la même clé d'idempotence continue de renvoyer ce résultat |
Les ressources extérieures au compte du propriétaire de l'identifiant peuvent renvoyer 404 plutôt que de révéler si l'ID d'un autre tenant existe.
Détails de validation#
La validation des champs renvoie des chemins que vous pouvez afficher à côté de vos propres champs de formulaire :
{
"error": {
"code": "invalid_request",
"message": "Request validation failed.",
"details": [
{ "path": "content.headline", "message": "String must contain at least 1 character(s)" }
],
"request_id": "6c0b2f2e-..."
}
}Les corps des requêtes de modification doivent être des objets JSON. Les tableaux, les corps vides, les données de formulaire et le JSON envoyé avec un type de contenu texte sont rejetés.
Décisions de nouvelle tentative#
- Réessayez une erreur
429après le nombre de secondes indiqué dansRetry-After. - Ne réessayez une erreur
500que pour des lectures sûres ou des écritures protégées par la mêmeIdempotency-Key. - Réessayez l'erreur
409d'idempotence « en cours » après le délai de l'en-têteRetry-After: 2. - Ne réessayez jamais aveuglément une erreur
503 outcome_unknown. Vérifiez d'abord la ressource ; n'utilisez une nouvelle clé d'idempotence qu'après avoir confirmé que la modification n'a pas eu lieu. - Ne réessayez pas les erreurs
400,401,403,404,413ni un conflit d'état tant que la cause n'a pas changé.
Consultez Limites de débit pour le comportement de backoff et la Référence de l'API pour le scope requis par chaque opération.