Performances
Parcourez correctement les listes, mettez en cache les données stables et parallélisez sans dépasser les limites.
Optimiser les performances d'une intégration de paiement consiste rarement à gagner quelques millisecondes. Il s'agit surtout de ne pas envoyer mille requêtes lorsque trente suffisent, car l'export nocturne consomme le même quota que le checkout utilisé à midi.
Trois sujets couvrent presque tous les besoins : la façon de parcourir une liste, les données que vous pouvez mettre en cache et le nombre d'appels exécutés simultanément.
Parcourir une liste
Tous les endpoints de liste sont paginés. La réponse contient un tableau items accompagné d'un
objet meta. Les paramètres sont identiques partout.
| Paramètre | Type | Valeur par défaut | Remarques |
|---|---|---|---|
per_page | integer | 25 | De 1 à 100, et 100 convient presque toujours |
page | integer | 1 | Mode par décalage |
cursor | string | Mode par curseur, voir Pagination | |
date_from, date_to | YYYY-MM-DD | Limites appliquées à created_at | |
status | string | Un seul statut, pas une liste |
Le mode choisi modifie la structure de meta, ce qui provoque souvent des erreurs.
| Mode | Contenu de meta |
|---|---|
| Décalage | current_page, last_page, per_page, total |
| Curseur | per_page, next_cursor, prev_cursor, has_more |
Écrire la boucle à la main multiplie les risques : erreur de décalage sur la dernière page, compteur qui n'augmente jamais ou liste qui s'allonge pendant son parcours. Chaque SDK fournit un itérateur qui gère ces cas.
# Offset mode: walk until current_page reaches last_page
curl "https://api.wajub.com/payments?per_page=100&page=1&date_from=2026-09-01&date_to=2026-09-30" \
-H "Authorization: sk_test.kZ3qP8mWvL2xR7tB5nY4hC6dF9jS1aG0eU3i…" \
| jq '{ count: (.items | length), page: .meta.current_page, last: .meta.last_page }'Le SDK renomme le tableau
La liste HTTP arrive dans items. Les SDKs la renvoient dans data, avec le même objet meta.
Extraire items du résultat d'un SDK donne undefined, puis la boucle échoue dès la première
itération.
Pour un export complet, procédez par périodes plutôt que par pages. Une période d'un mois produit des requêtes bornées et reproductibles. Relancer une période n'est pas perturbé par les lignes ajoutées depuis. Parcourir profondément les pages d'une table toujours alimentée peut afficher deux fois la même ligne ou en ignorer une.
Mettez en cache ce qui ne change pas
Trois endpoints décrivent la plateforme plutôt que votre compte. Ce sont ceux qu'il est utile de mettre en cache.
| Ressource | Endpoint | TTL raisonnable |
|---|---|---|
| Canaux de paiement | GET /channels | 1 heure |
| Pays pris en charge | GET /countries | 24 heures |
| Devises prises en charge | GET /currencies | 24 heures |
Ce sont aussi les seules routes accessibles à une clé restreinte sans scope, ce qui montre qu'elles contiennent très peu de données sensibles.
const cache = new Map();
async function cached(key, ttlMs, fetcher) {
const hit = cache.get(key);
if (hit && Date.now() - hit.at < ttlMs) return hit.value;
const value = await fetcher();
cache.set(key, { value, at: Date.now() });
return value;
}
const channels = await cached('channels:CM', 3_600_000, () =>
wajub.global.channels({ country: 'CM' }),
);Ne mettez jamais en cache l'état d'une transaction
Un paiement peut passer de processing à succeeded à tout moment. Un remboursement peut échouer
une heure après sa création. Si vous mettez un statut en cache, vous risquez d'expédier une
commande jamais payée. L'état d'une transaction provient d'un webhook ou d'une nouvelle lecture.
Cette règle a une conséquence simple : n'utilisez pas non plus le polling. Interroger chaque paiement toutes les quelques secondes est le moyen le plus courant d'atteindre une limite de requêtes sans rien apprendre. Le webhook vous informe déjà. Webhooks ou polling présente les rares cas où une lecture reste adaptée.
Parallélisez avec une limite
Les lectures séquentielles sont inutilement lentes lorsque les appels sont indépendants. Les
lectures parallèles sans limite sont pires : cent requêtes simultanées dépassent un plafond et vous
recevez cent réponses 429 au lieu de cent résultats.
import pLimit from 'p-limit';
const limit = pLimit(8);
const payments = await Promise.all(
paymentIds.map((id) => limit(() => wajub.payments.retrieve(id))),
);Entre cinq et dix appels simultanés constitue une plage efficace. Elle accélère réellement le traitement tout en restant sous les plafonds par endpoint. Ces plafonds sont plus stricts que le quota de l'équipe et sont les premiers touchés lors d'un pic. Gestion des limites de requêtes présente les valeurs.
Adaptez les délais d'expiration au parcours critique
Le SDK attend 30 secondes avant d'abandonner. Ce délai convient à un job en arrière-plan, mais il est beaucoup trop long pour un client face à un indicateur de chargement. Il rechargera la page et votre handler s'exécutera deux fois.
const payment = await wajub.payments.create(
{ amount: order.total, currency: order.currency, email: order.email },
{ idempotencyKey: `ORDER-${order.id}`, timeout: 8000 },
);Réduire le délai d'expiration augmente le risque d'un résultat ambigu, car vous abandonnez des requêtes qui étaient sur le point de réussir. C'est précisément pour cette raison que la clé d'idempotence accompagne le même appel. Sans cette clé, chaque requête lente peut provoquer un double débit.
Mesures à suivre
Quatre mesures indiquent si l'intégration fonctionne correctement. Aucune n'est une moyenne.
| Signal | À surveiller | Action |
|---|---|---|
| Latence de l'API | Le p95, pas la moyenne | La moyenne masque les requêtes qui expirent |
Taux de 429 | Toute valeur durablement supérieure à zéro | Une boucle existe, trouvez-la avant qu'elle ne s'aggrave |
Taux de 5xx | Une hausse, pas un pic isolé | Un cas est du bruit, une tendance indique un incident |
| Retard des webhooks | De l'horodatage de l'événement à son traitement | Un écart croissant signifie que votre file prend du retard |
Konsole fournit une vue par requête pour un paiement donné. Surveillance explique comment relier ces mesures à votre propre système d'alerte.
Pages associées
- PaginationLes paramètres, les deux structures de meta et le parcours HTTP brut.
- Gestion des limites de requêtesLes plafonds que votre concurrence doit respecter.
- Webhooks ou pollingPourquoi une boucle de lecture ne convient pas pour connaître un statut.
- SurveillanceTransformez ces quatre signaux en alertes.