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 valeurnext_starting_afterde 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.