Aller au contenu
CuikDocumentation

API : crawler, lire et exporter les liens

Endpoints, valeurs par défaut, inlinks/outlinks, pagination et export CSV gzip. Exemples cURL, PHP et Python à copier.

10 min de lectureMis à jour le 12/10/2026
Dans ce guide
  1. Lancer, suivre et récupérer un crawl
  2. 1. Préparer le crawl
  3. 2. Choisir les paramètres
  4. 3. Lire l’état et les résultats
  5. 4. Récupérer les liens pour votre outil
  6. Exemple Python : retrouver les identifiants
  7. Erreurs fréquentes
  8. Passer à un suivi régulier

Lancer, suivre et récupérer un crawl

Vous lancez un crawl, récupérez son identifiant, puis consultez son état. Les traitements et les documents ne sont pas terminés au retour du premier appel.

Action Requête Effet
Consulter vos crawls GET /v1/crawls Lecture, avec pagination.
Lancer un audit POST /v1/crawl Crée un crawl et utilise le quota d’audits du compte.
Suivre un audit GET /v1/crawl/{id} État, progression et liens disponibles.
Lire les liens GET /v1/crawl/{id}/data/links Liens enregistrés, filtres et pagination.
Exporter les liens GET /v1/crawl/{id}/export/links Téléchargement complet en CSV compressé, à la demande.

Avant de commencer : configurez votre clé API. Les exemples utilisent https://api.cuik.io, l’adresse de l’API publique de production.

1. Préparer le crawl

Vous pouvez retrouver le formulaire et le générateur de requêtes dans API → Moteur de crawl.

Formulaire de l’API de crawl CuikVrai formulaire Cuik, rempli avec example.com pour illustrer les paramètres. Aucun crawl n’est lancé par cette capture.

Exemple volontairement limité à 100 URL, sans rendu JavaScript ni génération de documents. Remplacez https://example.com/ par un site que vous êtes autorisé à auditer.

bash
curl --fail-with-body --silent --show-error \
  -X POST 'https://api.cuik.io/v1/crawl' \
  -H "Authorization: $CUIK_API_KEY" \
  -H 'Content-Type: application/json' \
  --data '{
    "url": "https://example.com/",
    "engine": "legacy",
    "js": false,
    "user_agent": "googlebot-smartphone",
    "max_urls": 100,
    "urls_per_second": 2,
    "sheet": false,
    "slide": false
  }'

Ce POST lance réellement un audit. Ne le répétez pas automatiquement après un timeout : consultez d’abord vos derniers crawls pour éviter un doublon.

Extrait de réponse, identifiant fictif :

json
{
  "id": "11111111-2222-4333-8444-555555555555",
  "status": "in progress",
  "engine": "legacy"
}

Conservez id. D’autres champs peuvent être présents, notamment remaining_crawls, active_crawls et error_message.

2. Choisir les paramètres

Champ JSON Valeur par défaut Usage
url À fournir explicitement URL complète en HTTPS.
engine legacy Valeur historique conservée pour compatibilité. En production, les nouveaux appels sont redirigés vers Cuik Spider ; cuikspider permet de le demander explicitement.
js false Active le rendu JavaScript ; plus coûteux en temps.
user_agent googlebot-smartphone Identité utilisée par le crawler.
max_urls 50000 Limite du crawl ; utilisez un petit nombre pour votre premier essai.
max_depth null Limite de profondeur ; null ne fixe pas de plafond.
urls_per_second 4 Vitesse demandée. L’alias JSON speed est également accepté. N’envoyez qu’un des deux.
sheet / slide false Demande les documents après le crawl, selon votre accès.
sheet_template / slide_template null Identifiant du template souhaité.
use_proxy false Demande le proxy résidentiel disponible sur le service.

Les options de Cuik Spider sont expliquées dans le guide des paramètres. Le formulaire API historique ne présente pas encore tous les réglages Spider. Sur une installation distincte, GET /v1/crawl-engine-policy permet de vérifier le routage actif.

Les emails de fin de crawl se règlent dans le compte, pas avec notify_email : ce champ historique n’active pas la notification.

3. Lire l’état et les résultats

Remplacez l’identifiant par celui renvoyé lors du lancement :

bash
CUIK_CRAWL_ID='11111111-2222-4333-8444-555555555555'
curl --fail-with-body --silent --show-error \
  "https://api.cuik.io/v1/crawl/$CUIK_CRAWL_ID" \
  -H "Authorization: $CUIK_API_KEY"

Le résultat contient un état global et un objet crawl. Ce n’est pas le même format que la réponse de lancement. Lisez notamment crawl.status, crawl.crawl_status, crawl.url_completed et crawl.url_total. Le champ historique crawl.data_url peut rester vide : utilisez les routes de données et d’export ci-dessous pour récupérer les liens.

État rencontré Lecture
queued, in progress En attente ou en cours. Réinterrogez après quelques secondes.
finalizing Collecte terminée, préparation des résultats en cours.
success, crawl success Résultats du crawl disponibles. Les documents peuvent encore être en préparation.
error Consultez error_message ; ne relancez pas sans examiner la cause.
paused, stopped, cancelled États possibles selon le moteur ; une attente automatique doit aussi les gérer.

Évitez de sonder en boucle rapide : un intervalle de 10 secondes est un bon point de départ. Prévoyez un timeout global dans votre automatisation. L’état global peut aussi refléter la génération des Sheets ou Slides : ne considérez pas toute valeur différente de success comme un échec.

4. Récupérer les liens pour votre outil

Ces routes HTTP s’appellent directement avec votre clé API Cuik. Aucun client MCP ni appel à une IA n’est nécessaire. Elles lisent un crawl existant de votre compte, sans relancer le crawl, générer de Sheet/Slide ni débiter un nouveau crédit de crawl. Les conditions d’accès et limites de débit habituelles de la clé API restent applicables.

Attendez crawl.crawl_status = "crawl success" (ou success / completed pour certaines archives). Un document peut encore être en préparation. Si la collecte est en cours ou la base occupée par la finalisation, l’API répond 409 : attendez le délai Retry-After, puis réessayez.

Seul le type de données links est proposé par ces nouvelles routes pour le moment. pages, images ou un type inconnu sont refusés, jamais remplacés silencieusement par d’autres données.

Filtres et valeurs par défaut

Les deux routes utilisent les mêmes filtres. Sans paramètre, elles retournent les liens Hyperlink vers des destinations internes.

Paramètre Défaut Valeurs et effet
internal true true : destination interne au périmètre du crawl ; false : externe ; all : toutes.
type hyperlink Type enregistré, sans distinction de casse, par exemple hyperlink ou HTML Canonical. all inclut tous les types présents dans la table de liens.
source Aucun filtre URL source exacte. Permet de lire les liens sortants d’une page.
destination Aucun filtre URL cible exacte. Permet de lire les liens entrants d’une page.
limit 100 Lecture JSON uniquement, de 1 à 1 000 lignes.
cursor 0 Lecture JSON uniquement. Pour continuer, recopiez next_cursor de la réponse précédente.
format csv.gz Export uniquement ; seul csv.gz est accepté.

Encodez les URL de filtre avec votre bibliothèque HTTP, notamment les &, ?, + et apostrophes. Les filtres se combinent. Un paramètre inconnu, répété ou invalide est refusé. L’export refuse limit et cursor : il contient toutes les lignes correspondant aux filtres, indépendamment de ce qui est affiché dans l’interface.

Consulter les liens entrants d’une page

bash
curl --fail-with-body --silent --show-error --get \
  "https://api.cuik.io/v1/crawl/$CUIK_CRAWL_ID/data/links" \
  -H "Authorization: $CUIK_API_KEY" \
  --data-urlencode 'destination=https://example.com/ma-page/' \
  --data-urlencode 'limit=100'

La réponse JSON contient crawl_id, dataset, columns, data (une liste d’objets), returned_rows, limit, has_more et next_cursor.

Exemple réduit, avec un identifiant et des valeurs fictifs :

json
{
  "crawl_id": "11111111-2222-4333-8444-555555555555",
  "dataset": "links",
  "columns": ["source", "destination", "anchor_text", "alt_text", "type", "rel", "is_follow", "is_internal", "source_status_code", "source_depth", "link_position"],
  "data": [{
    "source": "https://example.com/",
    "destination": "https://example.com/ma-page/",
    "anchor_text": "Découvrir",
    "alt_text": "",
    "type": "Hyperlink",
    "rel": "",
    "is_follow": true,
    "is_internal": true,
    "source_status_code": 200,
    "source_depth": 0,
    "link_position": null
  }],
  "returned_rows": 1,
  "limit": 100,
  "has_more": false,
  "next_cursor": null
}

Continuez tant que has_more vaut true, en conservant les mêmes filtres et en envoyant le next_cursor reçu. Arrêtez-vous quand il vaut null. Le curseur est un repère de pagination, pas le nombre de lignes ni le total du crawl. Les occurrences répétées d’un même lien sont conservées. Si vous reprenez ou remplacez le crawl, recommencez la pagination depuis zéro.

Champ de chaque lien Signification
source, destination URL source et cible.
anchor_text, alt_text Texte de l’ancre et texte alternatif enregistrés.
type, rel Type de lien et attribut rel.
is_follow, is_internal Booléens ; is_internal décrit la destination.
source_status_code, source_depth Code HTTP et profondeur de la page source enregistrés.
link_position Position lorsqu’elle existe dans l’archive, notamment certains imports SF. Cuik Spider ne la collecte pas encore : null.

Un champ inconnu vaut null, pas false ou 0. Une chaîne vide reste une chaîne vide. Les liens ne représentent pas les données de backlinks d’un fournisseur externe, ni l’inventaire distinct des images. Une ancienne archive qui ne conserve plus la table détaillée des liens répond 422, même si des compteurs ou des listes de pages sources subsistent. Les crawls Cuik Spider, y compris les imports de l’application locale qui conservent cette table, sont pris en charge.

Télécharger tout le maillage en un appel

bash
curl --fail --silent --show-error \
  "https://api.cuik.io/v1/crawl/$CUIK_CRAWL_ID/export/links?internal=true&type=hyperlink&format=csv.gz" \
  -H "Authorization: $CUIK_API_KEY" \
  --output liens.csv.gz

Le fichier est un CSV UTF-8, séparateur virgule, première ligne avec les noms des colonnes, compressé avec gzip. Les valeurs textuelles restent intactes ; guillemets, virgules et retours à la ligne sont échappés selon les règles CSV. Les booléens sont true / false et les valeurs inconnues deviennent des cellules vides. Le format est destiné à une lecture par script : utilisez un parseur CSV, pas un découpage par virgules ou par lignes.

La réponse utilise Content-Type: application/gzip, un nom de fichier dans Content-Disposition et X-Cuik-Export-Rows pour le nombre de liens, hors en-tête. Un export vide reste un fichier valide contenant l’en-tête. L’export ne crée pas de lien public : votre clé reste nécessaire. Le fichier temporaire est supprimé après son transfert ; aucun export supplémentaire n’est stocké systématiquement après chaque crawl.

Exemple PHP : télécharger puis lire sans tout charger en mémoire

Nécessite PHP avec cURL et zlib. Définissez CUIK_API_KEY et CUIK_CRAWL_ID dans votre environnement. Le fichier local temporaire est supprimé à la fin, y compris en cas d’erreur.

php
<?php
$key = getenv('CUIK_API_KEY');
$crawlId = getenv('CUIK_CRAWL_ID');
if (!$key || !$crawlId) {
    throw new RuntimeException('CUIK_API_KEY et CUIK_CRAWL_ID sont requis.');
}
$file = tmpfile();
if ($file === false) {
    throw new RuntimeException('Impossible de créer un fichier temporaire.');
}
$path = stream_get_meta_data($file)['uri'];
$url = 'https://api.cuik.io/v1/crawl/' . rawurlencode($crawlId)
    . '/export/links?' . http_build_query(['internal' => 'true', 'type' => 'hyperlink']);
$curl = curl_init($url);
$csv = false;
try {
    curl_setopt_array($curl, [
        CURLOPT_HTTPHEADER => ['Authorization: ' . $key],
        CURLOPT_FILE => $file,
        CURLOPT_FOLLOWLOCATION => false,
        CURLOPT_CONNECTTIMEOUT => 15,
        CURLOPT_TIMEOUT => 360,
    ]);
    $ok = curl_exec($curl);
    $status = curl_getinfo($curl, CURLINFO_HTTP_CODE);
    if ($ok === false || $status !== 200) {
        throw new RuntimeException('Export HTTP ' . $status . ' : ' . curl_error($curl));
    }
    fflush($file);
    $csv = fopen('compress.zlib://' . $path, 'rb');
    if ($csv === false) {
        throw new RuntimeException('Impossible de lire le CSV compressé.');
    }
    $columns = fgetcsv($csv, 0, ',', '"', '');
    while (($values = fgetcsv($csv, 0, ',', '"', '')) !== false) {
        $link = array_combine($columns, $values);
        // Remplacez ceci par l’enregistrement dans votre outil.
        echo $link['source'] . ' -> ' . $link['destination'] . PHP_EOL;
    }
} finally {
    if (is_resource($csv)) fclose($csv);
    curl_close($curl);
    fclose($file);
}

Sur 429, respectez Retry-After avant de redemander l’export. Sur 503, conservez les résultats précédents et réessayez plus tard. Aucun fichier incomplet n’est envoyé si sa préparation échoue ; si le téléchargement est coupé, jetez le fichier local partiel avant de réessayer. Pour un petit dépannage SQL, la route HTTP POST /v1/mcp/query-crawl-sql reste disponible, mais elle n’est pas destinée aux téléchargements massifs.

Exemple Python : retrouver les identifiants

Installez requests avec python -m pip install requests. Cet exemple effectue uniquement une lecture. Il vous aide aussi à retrouver un crawl après une coupure réseau.

python
import os
import requests

response = requests.get(
    "https://api.cuik.io/v1/crawls?limit=5&offset=0",
    headers={"Authorization": os.environ["CUIK_API_KEY"]},
    timeout=120,
)
response.raise_for_status()
for crawl in response.json()["crawls"]:
    print(crawl["id"], crawl["site"], crawl["status"])

Erreurs fréquentes

  • 401 : revoyez l’authentification.
  • 403 : accès, crédits insuffisants ou bêta non activée ; le message indique la cause.
  • 404 : identifiant introuvable ou crawl non accessible à votre compte.
  • 409 / 429 : conflit d’état ou capacité temporairement atteinte, selon l’opération ; lisez le message avant de réessayer.
  • 422 : JSON ou type incorrect, par exemple une URL sans protocole.

Les exemples et captures utilisent des données fictives ; ils ne prouvent pas qu’un audit a été exécuté sur votre compte. Vous pouvez consulter le même audit dans la liste des crawls.

Passer à un suivi régulier

Une fois votre premier appel vérifié, suivez Automatiser vos crawls pour construire le déclenchement, la boucle de suivi et la protection contre les doublons. Pour interpréter un code renvoyé par le moteur, consultez Dépanner un crawl.