ReplexaDocs

Pagination

Les listes sont paginées par curseur : pas de numéro de page, mais l'identifiant du dernier élément reçu.

Paramètres

  • limit : éléments par page, de 1 à 100 (défaut 10). Une valeur hors bornes est ramenée dans l'intervalle.
  • starting_after : la valeur next_starting_after de la page précédente.

En GET, ce sont des paramètres de requête. Pour POST /leads/list, ils vont dans le corps JSON, avec les filtres.

Réponse

json

{
  "items": [ { "id": "0193f0a2-…", "name": "Relance salons octobre", … } ],
  "next_starting_after": "0193f0a2-7c1e-7d4b-9a51-3f2b8c6d1e90"
}

next_starting_after est absent sur la dernière page : c'est le signal d'arrêt. Les éléments arrivent du plus récent au plus ancien (identifiants UUID v7, ordonnés dans le temps) ; un élément créé pendant le parcours apparaît en tête et n'est pas renvoyé dans les pages suivantes.

Quelques listes courtes (labels, tags, agents, outils, clés API) renvoient tout d'un coup, sans curseur : { items }. La référence indique la forme de chaque réponse.

Exemple : page suivante

curl

curl "https://app.replexa.eu/api/v2/campaigns?limit=100&starting_after=0193f0a2-7c1e-7d4b-9a51-3f2b8c6d1e90" \
  -H "Authorization: Bearer $REPLEXA_API_KEY"

Parcourir toute une liste

Node.js

const base = process.env.REPLEXA_API_URL; // ex. https://app.replexa.eu/api/v2
const headers = { Authorization: `Bearer ${process.env.REPLEXA_API_KEY}` };

async function allCampaigns() {
  const all = [];
  let cursor;
  do {
    const url = new URL(`${base}/campaigns`);
    url.searchParams.set("limit", "100");
    if (cursor) url.searchParams.set("starting_after", cursor);
    const res = await fetch(url, { headers });
    if (!res.ok) throw new Error(`${res.status} ${(await res.json()).message}`);
    const page = await res.json();
    all.push(...page.items);
    cursor = page.next_starting_after;
  } while (cursor);
  return all;
}

Python

import os, requests

base = os.environ["REPLEXA_API_URL"]  # ex. https://app.replexa.eu/api/v2
headers = {"Authorization": f"Bearer {os.environ['REPLEXA_API_KEY']}"}

def all_leads(campaign_id):
    body = {"campaign": campaign_id, "limit": 100}
    while True:
        page = requests.post(f"{base}/leads/list", json=body, headers=headers, timeout=30)
        page.raise_for_status()
        data = page.json()
        yield from data["items"]
        if "next_starting_after" not in data:
            break
        body["starting_after"] = data["next_starting_after"]

Pour un gros volume, gardez une page de 100 et respectez les limites de débit : 600 requêtes par minute suffisent pour 60 000 éléments par minute.