Aller au contenu
Chargement des API keys…

Pagination

Pagination par offset avec per_page et page, ou par curseur pour les gros exports.

Chaque endpoint de liste renvoie un tableau items et un objet meta. Deux modes partagent le même endpoint : la pagination par offset par défaut, la pagination par curseur dès que vous envoyez un cursor. Une page numérotée porte aussi le next_cursor qui la prolonge : un parcours par curseur commence donc par une requête ordinaire. meta vous indique quel mode a répondu : current_page en mode offset, prev_cursor en mode curseur.

GEThttps://api.wajub.com/payments

Paramètres

per_pageintegerfacultatifdéfaut : 25
Éléments par page, de 1 à 100. Toute valeur hors de cet intervalle renvoie un 422. Les listes de taxes sont à 50 par défaut.
pageintegerfacultatifdéfaut : 1
Numéro de page, pour la pagination par offset : un entier à partir de 1. Toute autre valeur renvoie une 422.
cursorstringfacultatif
Un curseur opaque : le meta.next_cursor ou le meta.prev_cursor d'une réponse précédente, page numérotée comprise. L'envoyer fait passer l'endpoint en mode curseur et page est ignoré. Renvoyez-le tel qu'il a été reçu : un curseur que Wajub n'a pas renvoyé, ou qui a été modifié, renvoie un 422 sur cursor.

Les filtres dépendent de la ressource, ils ne sont pas globaux. Sur GET /payments :

statusstringfacultatif
L'une des valeurs pending, processing, succeeded, expired, partial, failed, cancelled, refunded, partially_refunded.
date_fromdatefacultatif
Borne inférieure sur created_at, au format YYYY-MM-DD.
date_todatefacultatif
Borne supérieure sur created_at. Ne doit pas précéder date_from.
amount_minnumberfacultatif
Montant minimum, dans l'unité principale.
amount_maxnumberfacultatif
Montant maximum. Ne doit pas être inférieur à amount_min.
searchstringfacultatif
Texte libre sur la référence, la description et les informations du client.

Pagination par offset

Le mode par défaut. Demandez un numéro de page, vous recevez un meta qui indique combien il y en a au total, et d'où repartir avec un curseur :

GEThttps://api.wajub.com/payments?per_page=2&status=succeeded
curl "https://api.wajub.com/payments?per_page=2&status=succeeded" \
-H "Authorization: $WAJUB_API_KEY"
Réponse · 200 OK
{
"code": 200,
"status": "OK",
"message": "Payments retrieved",
"items": [
{
"id": "trx_CSUGajfv9xh0XQ5wu2lx",
"reference": "order-1042",
"status": "succeeded",
"amount": 5000,
"currency": "XAF"
},
{
"id": "trx_9Wm4Kd2pR7vB5nL6hY1c",
"reference": "order-1043",
"status": "succeeded",
"amount": 12000,
"currency": "XAF"
}
],
"meta": {
"current_page": 1,
"last_page": 69,
"per_page": 2,
"total": 137,
"next_cursor": "c_9fK2mQ7vB4nL6hR1xT8w",
"has_more": true
}
}

has_more indique si une page suit celle-ci, et next_cursor est le curseur du dernier élément de la page : null sur la dernière page. Les deux sont là pour vous permettre de continuer avec un curseur. Pour rester en mode offset, ignorez-les.

Bouclez jusqu'à ce que current_page atteigne last_page. Utilisez la plus grande taille de page possible, 100, pour qu'un historique de 137 éléments tienne en deux requêtes au lieu de six :

async function allPayments(filters = {}) {
const all = [];
let page = 1;

while (true) {
  const params = new URLSearchParams({ ...filters, per_page: '100', page: String(page) });
  const res = await fetch(`https://api.wajub.com/payments?${params}`, {
    headers: { Authorization: process.env.WAJUB_API_KEY },
  });
  const { items, meta } = await res.json();

  all.push(...items);

  if (page >= meta.last_page) break;
  page += 1;
}

return all;
}

Pagination par curseur

Les pages par offset se décalent quand de nouveaux éléments arrivent pendant votre parcours, et ralentissent sur un long historique. Les curseurs évitent les deux : passez cursor et chaque page est ancrée sur le dernier élément que vous avez vu.

Vous n'avez aucun curseur à envoyer à la première requête : commencez donc sans. La première page est une page numérotée, et son meta porte next_cursor. Renvoyez-le comme cursor et le parcours continue en mode curseur, juste après le dernier élément reçu, sans élément sauté ni servi deux fois. Cela vaut depuis n'importe quelle page numérotée, pas seulement la première.

meta change de forme en mode curseur. current_page, last_page et total disparaissent, remplacés par :

Réponse en mode curseur
{
"code": 200,
"status": "OK",
"message": "Payments retrieved",
"items": [
],
"meta": {
"per_page": 25,
"next_cursor": "c_4Tz8Wm2Qx6Hb9Lc3NdP5k",
"prev_cursor": null,
"has_more": true
}
}

Renvoyez next_cursor comme cursor et arrêtez-vous quand has_more vaut false :

async function* streamPayments() {
// Pas de curseur à la première requête : cette page porte déjà next_cursor.
let cursor = null;

do {
  const params = new URLSearchParams({ per_page: '100' });

  if (cursor) params.set('cursor', cursor);

  const res = await fetch(`https://api.wajub.com/payments?${params}`, {
    headers: { Authorization: process.env.WAJUB_API_KEY },
  });
  const { items, meta } = await res.json();

  yield* items;
  cursor = meta.has_more ? meta.next_cursor : null;
} while (cursor);
}

Endpoints et modes pris en charge

Le mode curseur est disponible partout où la liste a un tri stable sur created_at. Trois listes ne proposent que l'offset : leur meta n'a ni next_cursor ni has_more.

EndpointOffsetCurseurClé de la liste
GET /paymentsOuiOuiitems
GET /transfersOuiOuiitems
GET /refundsOuiOuiitems
GET /customersOuiOuiitems
GET /beneficiariesOuiOuiitems
GET /invoicesOuiOuiitems
GET /linksOuiOuiitems
GET /accountsOuiOuiitems
GET /disputesOuiOuiitems
GET /webhooksOuiOuiitems
GET /eventsOuiNonevents
GET /tax/codes, /tax/jurisdictionsOuiNonvoir Taxes

GET /invoices et GET /links acceptent sort_by et sort_dir. Le mode curseur a besoin de leur ordre par défaut, du plus récent au plus ancien : avec un autre tri, cursor est ignoré et la page numérotée ne porte ni next_cursor ni has_more. Paginez alors par numéro.

Préférez les webhooks au polling

Pour réagir à un changement de statut, abonnez-vous aux webhooks au lieu de paginer en boucle. La pagination sert aux exports, au rapprochement et aux écrans d'historique.

Que pensez-vous de ce contenu ?