Aller au contenu principal

Erreurs & Pagination

Gérez correctement les réponses API pour des intégrations robustes.

Format des erreurs

Toutes les erreurs suivent une structure JSON cohérente :

{
"success": false,
"error": {
"code": "VALIDATION_ERROR",
"message": "Type d'entité invalide",
"details": {
"field": "entityType",
"allowed": ["concept", "object", "process", "actor"]
}
},
"requestId": "req_xxxxxxxxxxxx"
}

Codes HTTP

Codes de succès

CodeSignificationUtilisation
200OKGET/PUT/PATCH réussi
201CreatedPOST réussi (ressource créée)
204No ContentDELETE réussi

Erreurs client

CodeSignificationCause courante
400Bad RequestJSON invalide, champs requis manquants
401UnauthorizedClé API invalide/manquante
403ForbiddenPermissions insuffisantes, mauvais workspace
404Not FoundRessource inexistante
409ConflictConflit de version (édition concurrente)
422UnprocessableValidation échouée (JSON valide, données invalides)
429Too Many RequestsRate limit dépassé

Erreurs serveur

CodeSignificationAction
500Internal Server ErrorRéessayer avec backoff, signaler si persistant
502Bad GatewayProblème temporaire, réessayer
503Service UnavailableMaintenance, consulter la page de status
504Gateway TimeoutRequête trop lente, réessayer

Codes d'erreur

CodeDescription
VALIDATION_ERRORValidation du payload échouée
AUTHENTICATION_ERRORCredentials invalides ou manquants
AUTHORIZATION_ERRORPermissions insuffisantes
NOT_FOUNDRessource demandée introuvable
CONFLICTConflit de ressource (doublon, version incorrecte)
RATE_LIMITEDTrop de requêtes
INTERNAL_ERRORErreur côté serveur

Rate Limiting

Headers de rate limit

X-RateLimit-Limit: 60
X-RateLimit-Remaining: 23
X-RateLimit-Reset: 1700000000
Retry-After: 45

Gestion du rate limit

async function apiCall(url, options, retries = 3) {
const response = await fetch(url, options);

if (response.status === 429 && retries > 0) {
const retryAfter = response.headers.get('Retry-After') || 60;
await sleep(retryAfter * 1000);
return apiCall(url, options, retries - 1);
}

return response;
}

Backoff exponentiel

const delay = Math.min(1000 * Math.pow(2, attempt), 30000);
await sleep(delay + Math.random() * 1000); // Ajouter du jitter

Pagination

Paramètres de requête

ParamètreTypeDéfautMaxDescription
limitinteger50100Éléments par page
offsetinteger0-Éléments à sauter

Exemple de requête

curl "https://api.dev-growthsystemes.com/api/queries/nodes?limit=20&offset=40" \
-H "Authorization: Bearer $API_KEY" \
-H "x-workspace-id: $WORKSPACE_ID"

Métadonnées de réponse

{
"success": true,
"data": [...],
"meta": {
"total": 156,
"limit": 20,
"offset": 40,
"hasMore": true
}
}

Parcourir toutes les pages

async function fetchAll(endpoint) {
const results = [];
let offset = 0;
const limit = 100;

while (true) {
const response = await fetch(
`${endpoint}?limit=${limit}&offset=${offset}`,
{ headers }
);
const { data, meta } = await response.json();

results.push(...data);

if (!meta.hasMore) break;
offset += limit;
}

return results;
}

Filtrage & Tri

Paramètres de filtrage

# Filtrer par type d'entité
?entityType=concept

# Filtrer par nom (correspondance partielle)
?name=Client

# Filtres multiples (logique ET)
?entityType=concept&name=Client

Paramètres de tri

# Tri ascendant
?sort=name

# Tri descendant
?sort=-createdAt

# Champs de tri multiples
?sort=-updatedAt,name

Gestion des conflits de version

Version attendue

Prévenir les conflits de modification concurrente :

curl -X POST "https://api.dev-growthsystemes.com/api/commands/execute" \
-H "Authorization: Bearer $API_KEY" \
-H "x-workspace-id: $WORKSPACE_ID" \
-H "Content-Type: application/json" \
-d '{
"type": "UPDATE_NODE",
"payload": { "id": "xxx", "name": "Nouveau Nom" },
"expectedVersion": 5
}'

Gestion du 409 Conflict

{
"success": false,
"error": {
"code": "CONFLICT",
"message": "Version mismatch",
"details": {
"expectedVersion": 5,
"actualVersion": 7
}
}
}

Résolution : Recharger la ressource, fusionner les changements, réessayer avec la nouvelle version.

Suivi des requêtes

Chaque réponse inclut un requestId pour le débogage :

{
"requestId": "req_abc123def456"
}

Incluez-le dans vos tickets de support pour une résolution plus rapide.