L'API Notiondesk renvoie chaque erreur avec la même enveloppe JSON et un en-tête code lisible par machine, limite chaque clé à 120 lectures et 20 écritures par minute, et permet de retenter toute modification en toute sécurité grâce à un en-tête Idempotency-Key. Cet article répertorie tous les codes d'erreur de l'API Notiondesk, explique les limites de débit et leurs en-têtes, et montre comment configurer des tentatives de reconnexion qui évitent de modifier deux fois la même donnée.
L'enveloppe d'erreur de l'API Notiondesk
Chaque erreur répond de la même manière, et chaque champ est toujours présent :
{
"object": "error",
"code": "validation_error",
"message": "The request parameters are invalid.",
"request_id": "0f2c1e94-7a1b-4c2d-9e3f-5a6b7c8d9e0f",
"errors": [
{"field": "page_size", "message": "This value should be between 1 and 100."}
]
}| Champ | Signification |
|---|---|
object | Toujours __PRÉSERVÉ_78__ |
code | Erreur lisible par machine. Basculez votre code uniquement sur ce champ. |
message | Une explication compréhensible par un humain. Elle peut changer, alors ne la cherchez jamais à la déchiffrer. |
request_id | Identifie la requête lorsque vous contactez l'assistance. null lorsque la requête a échoué avant d'atteindre une route, par exemple sur un chemin inconnu. |
errors | Problèmes au niveau des champs, chacun avec un field et un message. Vide lorsque l'erreur ne concerne pas une entrée spécifique. |
Comment field nomme une valeur
- Un champ de niveau supérieur est son nom :
page_size.
- Un champ à l'intérieur d'une liste nomme la liste, l'entrée entre crochets, puis le champ :
items[fr].page_title.
- Le crochet contient l'identifiant de l'entrée tel que vous l'avez envoyé (
localedansitems,category_iddanschangelog_categories) lorsque chaque entrée possède un identifiant unique. Sinon, il contient la position de l'entrée (à partir de zéro) :items[0].locale.
- Un problème avec la requête dans son ensemble a été
"field": null.
Notiondesk Codes d'erreur de l'API
code | statut HTTP | Signification | Ce qu'il faut faire |
|---|---|---|---|
authentication_error | 401 | La clé ou le jeton d'accès est manquant ou ne peut pas être utilisé. | Vérifiez la clé, sa date d'expiration et le forfait. Consultez la section « Authentification avec l'API Notiondesk ». |
insufficient_scope | 403 | L'identifiant ne correspond pas à la portée requise pour cet itinéraire. | Utilisez une clé dont la portée est nommée dans WWW-Authenticate |
permission_denied | 402, 403 | L'identifiant ne peut pas effectuer cette action sur cette ressource, par exemple parce que le plan ne dispose pas de la fonctionnalité requise. | Vérifiez votre forfait et les paramètres du centre d'aide. Ne réessayez pas sans modifier les paramètres. |
invalid_version | 400 | L'en-tête nd-version désigne une version inconnue | Envoyez 2026-10-16 ou omettez l'en-tête. |
validation_error | 400, 422 | Un paramètre ou un champ du corps est invalide, inconnu ou hors limites. | Corrigez les champs listés dans errors |
not_found | 404, 405 | Le chemin, la ressource ou la méthode n'existe pas. | Vérifiez les identifiants et la méthode |
conflict_error | 409 | La requête est incompatible avec l'état actuel ; par exemple, une synchronisation est déjà en cours. | Attendez, puis réessayez. |
idempotency_key_invalid | 400 | L'en-tête Idempotency-Key est vide ou contient plus de 255 caractères. | Envoyer de 1 à 255 caractères |
idempotency_key_reused | 422 | Le Idempotency-Key a déjà été utilisé pour une autre requête | Utilisez une nouvelle clé pour une nouvelle requête |
request_in_progress | 409 | Une requête avec le même Idempotency-Key est toujours en cours. | Attendez, puis réessayez avec la même touche. |
rate_limited | 429 | Trop de demandes | Attendez Retry-After secondes |
internal_error | 500 et plus | Notiondesk a échoué | Réessayez plus tard et indiquez le code request_id si vous contactez l'assistance. |
Une demande pour un centre d'aide ou une ressource en dehors de votre espace de travail répond 404 not_found, l'API ne révèle donc jamais si elle existe.
Notiondesk Limites de débit de l'API
Chaque clé API et chaque autorisation OAuth dispose de deux budgets de requêtes, comptabilisés sur une fenêtre glissante d'une minute :
| Budget | Itinéraires | Requêtes par minute |
|---|---|---|
| Lectures | __PRÉSERVÉ_38__ itinéraires | 120 |
| Écrit | itinéraires POST, PATCH et DELETE | 20 |
Les rapports analytiques sont également comptabilisés dans un budget de 30 requêtes par minute et par centre d'aide , partagé par chaque application clé et OAuth de l'espace de travail.
Les réponses comportent trois en-têtes :
| En-tête | Signification |
|---|---|
X-RateLimit-Limit | Requêtes autorisées dans la fenêtre actuelle |
X-RateLimit-Remaining | Requêtes laissées dans la fenêtre actuelle |
Retry-After | Secondes avant l'acceptation de la prochaine requête ; 0 tant que les requêtes restent |
Une requête dépassant le budget répond 429 rate_limited. Attendez le nombre de secondes indiqué dans Retry-After avant d'envoyer la requête suivante.
Réessayez en toute sécurité avec Idempotency-Key
Un délai d'attente réseau vous empêche de savoir si une modification a bien été prise en compte. L'en-tête Idempotency-Key vous permet de renvoyer la même requête sans rien modifier deux fois.
Chaque route qui modifie un élément l'accepte : changements de redirection de page, mises à jour des paramètres et de l'identité visuelle, modifications d'intégration et déclencheurs de synchronisation. Envoyez une valeur unique de 1 à 255 caractères, comme un UUID, lors de la première tentative, puis la même valeur à chaque nouvelle tentative.
Que se passe-t-il lors d'une nouvelle tentative :
curl -X POST "https://api.notiondesk.so/sites/c74781f6-1aea-4e17-ab23-bbb8b4d174b6/page-redirects" \
-H "Authorization: Bearer $NOTIONDESK_API_KEY" \
-H "nd-version: 2026-10-16" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: 6f0d6b1e-create-getting-started" \
-d '{"type": "article", "source_path": "/legacy/getting-started", "target_id": "1761580412", "locale": "en"}'| Réessayer | Résultat |
|---|---|
| Même clé, même corps, même route, après la fin de la première requête | La première réponse est à nouveau la même, avec le statut et le corps du message, et porte la mention X-Idempotent-Replay: true. Rien ne change. |
| Même clé pendant que la première requête est toujours en cours d'exécution. | 409 request_in_progress. Veuillez patienter et réessayer. |
| Même clé avec des identifiants de corps, de route ou de chemin différents | 422 __PRÉSERVÉ_24__ |
| Même clé et même corps de requête après que la première requête ait renvoyé une erreur | La requête est exécutée à nouveau. |
Une réponse réussie contient X-Idempotent-Replay: false lors de la première exécution et true lors d'une nouvelle exécution. Notiondesk conserve une clé pendant au moins 24 heures. Une clé est associée à la clé API ou à l'autorisation OAuth qui l'a envoyée, et une autorisation OAuth conserve ses clés lors des renouvellements de jeton.
Sans l'en-tête, une requête est exécutée une première fois, puis une nouvelle tentative est effectuée.
Une stratégie de nouvelle tentative qui fonctionne
- Générez un
Idempotency-Keypar modification logique et réutilisez-le pour chaque nouvelle tentative de cette modification.
- Sur
429 rate_limited, attendezRetry-Aftersecondes, puis réessayez.
- Sur
409 request_in_progress, patientez quelques secondes, puis réessayez avec la même touche. Sur409 conflict_error, une synchronisation du centre d'aide est déjà en cours : patientez quelques minutes avant de réessayer, ou ignorez cette opération.
- Sur
500et supérieur, ou en cas d'erreur réseau, réessayer avec un délai exponentiel, par exemple après 1, 2, 4 et 8 secondes.
- Ne réessayez jamais
400,401,403,404ou422sans les modifier. Corrigez d'abord la requête.
En JavaScript, pour toute route qui modifie un élément, le programme s'arrête sur conflict_error et laisse cette décision à votre code :
Questions fréquentes
import { randomUUID } from "node:crypto";
const sleep = (seconds) => new Promise((resolve) => setTimeout(resolve, seconds * 1000));
async function notiondeskRequest(method, path, body, attempts = 5) {
const idempotencyKey = randomUUID();
for (let attempt = 0; attempt < attempts; attempt++) {
let response;
try {
response = await fetch(`https://api.notiondesk.so${path}`, {
method,
headers: {
Authorization: `Bearer ${process.env.NOTIONDESK_API_KEY}`,
"nd-version": "2026-10-16",
"Content-Type": "application/json",
"Idempotency-Key": idempotencyKey,
},
body: body ? JSON.stringify(body) : undefined,
});
} catch {
await sleep(2 ** attempt);
continue;
}
if (response.ok) {
return response.status === 204 ? null : response.json();
}
const error = await response.json().catch(() => ({}));
const retryable = response.status === 429 || response.status >= 500 || error.code === "request_in_progress";
if (!retryable) {
throw new Error(`${response.status} ${error.code}: ${error.message}`);
}
const retryAfter = Number(response.headers.get("Retry-After"));
await sleep(retryAfter > 0 ? retryAfter : 2 ** attempt);
}
throw new Error(`Notiondesk request failed after ${attempts} attempts`);
} Quelles sont les limites de débit de l'API Notiondesk ?
120 requêtes de lecture et 20 requêtes d'écriture par minute pour chaque clé API ou autorisation OAuth, plus 30 requêtes d'analyse par minute pour chaque centre d'aide. Une requête dépassant le budget autorisé génère une réponse 429 avec un en-tête Retry-After.
Quel champ mon code doit-il vérifier en cas d'erreur ?
code. C'est le seul classificateur stable et lisible par machine. Le message est destiné aux humains et peut évoluer.
Que dois-je envoyer au support lorsqu'une requête échoue ?
Le request_id de la réponse d'erreur, la route que vous avez appelée et l'heure de la requête.
Est-il sûr de réessayer un déclencheur de synchronisation ?
Oui, avec un Idempotency-Key. Une nouvelle tentative avec la même clé renvoie le même résultat et ne met rien en file d'attente. Sans clé, un second déclenchement de synchronisation de site pendant que le premier est en cours renvoie 409 conflict_error.