Pagination
Toutes les listes (/v1/addresses, /v1/rules, /v1/channels, /v1/notifications, /v1/matches, /v1/events) sont paginées par curseur et triées du plus récent au plus ancien.
Réponse#
{
"data": [ { "id": "0193a1b2-5c3d-7e4f-8a9b-0c1d2e3f4a5b", "...": "..." } ],
"has_more": true,
"next_cursor": "0193a1b25c3d7e4f8a9b0c1d2e3f4a5b"
}| Champ | Sens |
|---|---|
data |
Éléments de la page. |
has_more |
true s’il reste des éléments après cette page. |
next_cursor |
Curseur de la page suivante, ou null sur la dernière page. |
Paramètres#
| Paramètre | Sens |
|---|---|
limit |
Taille de la page, de 1 à 100. Par défaut : 50. |
cursor |
Valeur de next_cursor de la page précédente, telle quelle. |
Le curseur est opaque : son format peut changer, ne le construisez pas vous-même. Gardez les mêmes filtres d’une page à l’autre. Un limit hors bornes ou un curseur invalide répond 400 invalid_query avec details.field.
Un élément créé pendant le parcours n’apparaît pas dans les pages suivantes : le parcours ne donne ni doublon ni saut.
Parcourir toute une liste#
curl "https://aicscan.io/v1/matches?limit=100" -H "Authorization: Bearer $AICSCAN_API_KEY"
# puis, tant que has_more vaut true :
curl "https://aicscan.io/v1/matches?limit=100&cursor=0193a1b25c3d7e4f8a9b0c1d2e3f4a5b" \
-H "Authorization: Bearer $AICSCAN_API_KEY"async function* listAll(path, params = {}) {
let cursor;
do {
const qs = new URLSearchParams({ ...params, limit: '100', ...(cursor ? { cursor } : {}) });
const res = await fetch(`https://aicscan.io${path}?${qs}`, {
headers: { Authorization: `Bearer ${process.env.AICSCAN_API_KEY}` },
});
const page = await res.json();
if (!res.ok) throw new Error(page.error.code);
yield* page.data;
cursor = page.has_more ? page.next_cursor : null;
} while (cursor);
}
for await (const match of listAll('/v1/matches', { severity: 'critical' })) {
console.log(match.id, match.rule.name);
}import os
import requests
def list_all(path, **params):
session = requests.Session()
session.headers["Authorization"] = f"Bearer {os.environ['AICSCAN_API_KEY']}"
cursor = None
while True:
query = {**params, "limit": 100, **({"cursor": cursor} if cursor else {})}
resp = session.get(f"https://aicscan.io{path}", params=query, timeout=10)
resp.raise_for_status()
page = resp.json()
yield from page["data"]
if not page["has_more"]:
break
cursor = page["next_cursor"]
for match in list_all("/v1/matches", severity="critical"):
print(match["id"], match["rule"]["name"])Filtres de dates#
/v1/matches, /v1/events et /v1/notifications acceptent since (inclus) et until (exclu), en ISO 8601 : 2026-11-01, 2026-11-01T00:00:00Z ou avec un décalage horaire. Une date illisible répond 400 invalid_query.
curl "https://aicscan.io/v1/matches?since=2026-11-01&until=2026-12-01&severity=critical" \
-H "Authorization: Bearer $AICSCAN_API_KEY"