API RGPDScan
Lancez un audit cookies & RGPD sur n'importe quel nom de domaine et récupérez le rapport en JSON ou en PDF, sans passer par l'interface web.
URL de base : https://rgpdscan.com/api/v1 · Format : JSON (UTF-8) · Version : v1
Chaque audit charge le site dans un vrai navigateur (Chromium), observe les cookies, le stockage local et les requêtes tierces avant et après consentement, analyse la bannière (présence, bouton refuser, dark patterns) et les mentions légales / politique de confidentialité.
Authentification
Toutes les requêtes portent une clé API dans l'en-tête Authorization :
Authorization: Bearer rgpd_live_xxxxxxxxxxxxxxxxxxxxxxxx
Créez vos clés dans Tableau de bord → Clés API. La clé n'est affichée qu'une fois ; elle est stockée hachée (SHA-256) de notre côté. Vous pouvez en créer jusqu'à 5, leur donner une date d'expiration et les révoquer à tout moment.
| Scope | Donne accès à |
|---|---|
scans:write | Lancer des audits |
scans:read | Lire les audits et télécharger les PDF |
sites:read / sites:write | Gérer les sites (optionnel : les audits par domaine créent le site automatiquement) |
Vérifier sa clé :
curl https://rgpdscan.com/api/v1/me -H "Authorization: Bearer $RGPDSCAN_KEY"
Workflow type
- Lancer l'audit :
POST /auditsavec le domaine. Réponse immédiate (202) avec unid. - Attendre : interrogez
GET /audits/{id}toutes les 15 à 30 s jusqu'àstatus = "completed"(ou"failed"). Durée typique : 1 à 4 minutes. - Récupérer le rapport : JSON dans
data.report, PDF viaGET /audits/{id}/pdf.
pending → running → completed | failed. Un audit en échec (site injoignable, timeout) est automatiquement recrédité.Quotas & facturation
| Limite | Valeur |
|---|---|
| Débit | 120 requêtes / minute par compte (en-têtes X-RateLimit-Limit et X-RateLimit-Remaining) |
| Taille d'un lot | 100 domaines par appel POST /audits/batch |
| Pages analysées | 10 par défaut, jusqu'à 50 (paramètre pages) |
| File d'attente | Les audits sont mis en file et traités en parallèle ; aucune limite sur le nombre d'audits en attente |
Facturation au rapport : 1 audit lancé = 1 crédit. Les crédits sont prépayés (pack ou forfait annuel), sans abonnement ni audits récurrents imposés. Le téléchargement du PDF et les lectures JSON sont gratuits et illimités. Relancer un domaine déjà en cours d'audit ne consomme rien (l'audit en cours est renvoyé). Les comptes Agence / Enterprise peuvent aussi utiliser l'API sur leur abonnement.
Aucun archivage n'est imposé : récupérez le PDF une fois et stockez-le chez vous.
Lancer un audit
/api/v1/audits
| Champ | Type | Description |
|---|---|---|
domain requis | string | Nom de domaine (exemple.fr) ou URL (https://www.exemple.fr/page). Seul l'hôte est conservé ; l'audit démarre sur https://{hôte}/. |
pages | integer | Nombre max. de pages à explorer (1–50, défaut 10). |
curl -X POST https://rgpdscan.com/api/v1/audits \
-H "Authorization: Bearer $RGPDSCAN_KEY" \
-H "Content-Type: application/json" \
-d '{"domain": "exemple.fr"}'
HTTP/1.1 202 Accepted
{
"success": true,
"data": {
"id": "V1StGXR8_Z5jdHi6B-myT",
"domain": "https://exemple.fr/",
"status": "pending",
"billedWith": "credit",
"reused": false,
"links": {
"self": "/api/v1/audits/V1StGXR8_Z5jdHi6B-myT",
"pdf": "/api/v1/audits/V1StGXR8_Z5jdHi6B-myT/pdf"
}
}
}
Si un audit est déjà en cours pour ce domaine, il est renvoyé avec "reused": true (HTTP 200) et aucun crédit n'est consommé : vous pouvez réessayer sans risque.
Lancer un lot
/api/v1/audits/batch
Idéal pour le rattrapage d'un parc existant. Jusqu'à 100 domaines par appel ; chaque domaine est traité indépendamment (un domaine invalide n'empêche pas les autres).
curl -X POST https://rgpdscan.com/api/v1/audits/batch \
-H "Authorization: Bearer $RGPDSCAN_KEY" \
-H "Content-Type: application/json" \
-d '{"domains": ["exemple.fr", "autre-site.com", "pas un domaine"]}'
{
"success": true,
"data": {
"queued": 2,
"failed": 1,
"results": [
{ "input": "exemple.fr", "id": "V1St…", "domain": "https://exemple.fr/", "status": "pending", "billedWith": "credit", "reused": false, "links": { … } },
{ "input": "autre-site.com", "id": "Uakg…", "domain": "https://autre-site.com/", "status": "pending", "billedWith": "credit", "reused": false, "links": { … } },
{ "input": "pas un domaine", "error": { "code": "INVALID_DOMAIN", "message": "Invalid domain" } }
]
}
}
Si les crédits s'épuisent en cours de lot, les domaines restants sont renvoyés avec l'erreur INSUFFICIENT_CREDITS.
Lire un audit
/api/v1/audits/{id}
curl https://rgpdscan.com/api/v1/audits/V1StGXR8_Z5jdHi6B-myT \
-H "Authorization: Bearer $RGPDSCAN_KEY"
{
"success": true,
"data": {
"id": "V1StGXR8_Z5jdHi6B-myT",
"domain": "https://exemple.fr/",
"status": "completed",
"error": null,
"createdAt": "2026-10-30 09:12:03",
"completedAt": "2026-10-30T09:14:41.118Z",
"report": {
"rgpdScore": 62,
"overallScore": 62,
"pagesScanned": 10,
"cookies": [
{ "name": "_ga", "category": "analytics", "description": "Google Analytics", "severity": "major", "recommendation": "…", "foundOnPages": ["https://exemple.fr/"] }
],
"trackers": [
{ "name": "Meta Pixel", "url": "https://connect.facebook.net/…", "category": "advertising", "severity": "critical", "recommendation": "…", "foundOnPages": ["…"] }
],
"issues": [
{ "type": "pre_consent_tracking", "severity": "critical", "description": "Cookies publicitaires déposés avant tout consentement", "article": "Art. 82 Loi Informatique et Libertés", "recommendation": "…" }
]
},
"links": { "self": "…", "pdf": "…" }
}
}
report vaut null tant que l'audit n'est pas completed. Gravités : critical, major, minor, info.
Télécharger le PDF
/api/v1/audits/{id}/pdf
Renvoie le rapport au format PDF A4 (Content-Type: application/pdf) : scores, non-conformités classées par gravité avec recommandations, liste des cookies et des traceurs tiers. Disponible dès que l'audit est completed (sinon HTTP 409 NOT_READY). Gratuit, téléchargeable autant de fois que nécessaire.
curl https://rgpdscan.com/api/v1/audits/V1StGXR8_Z5jdHi6B-myT/pdf \
-H "Authorization: Bearer $RGPDSCAN_KEY" \
-o audit-exemple.fr.pdf
Lister les audits
/api/v1/audits?status=completed&limit=50&offset=0
| Paramètre | Description |
|---|---|
status | Filtre : pending, running, completed, failed |
limit | 1–100 (défaut 50) |
offset | Pagination (défaut 0). Tri : plus récents d'abord. |
Crédits restants
/api/v1/usage
{
"success": true,
"data": {
"apiCredits": 2437,
"plan": "free",
"planIncludesApi": false,
"scansUsedThisMonth": 0,
"limits": { "requestsPerMinute": 120, "maxBatchSize": 100, "maxPagesPerAudit": 50 }
}
}
Erreurs
Format commun :
{ "success": false, "error": { "code": "INSUFFICIENT_CREDITS", "message": "No API credits left. Contact sales to top up." } }
| HTTP | Code | Signification |
|---|---|---|
| 400 | INVALID_DOMAIN | Domaine absent ou invalide (IP, localhost, nom sans extension…) |
| 401 | UNAUTHORIZED | Clé absente, invalide, expirée ou révoquée |
| 402 | INSUFFICIENT_CREDITS | Plus de crédits : contactez-nous pour recharger |
| 403 | ERROR | Scope manquant sur la clé, ou compte sans accès API |
| 404 | ERROR | Audit inexistant ou appartenant à un autre compte |
| 409 | NOT_READY | PDF demandé avant la fin de l'audit |
| 429 | ERROR | Débit dépassé : réessayez après 60 s |
| 5xx | — | Incident temporaire : réessayez avec un délai croissant |
Script complet (Node.js 18+)
Audite une liste de domaines (un par ligne), attend les résultats et enregistre chaque PDF. Adapté au rattrapage d'un parc : envoi par lots de 100.
// audit.mjs — usage: RGPDSCAN_KEY=rgpd_live_… node audit.mjs domaines.txt
import { readFile, writeFile } from 'node:fs/promises';
const API = 'https://rgpdscan.com/api/v1';
const headers = { Authorization: `Bearer ${process.env.RGPDSCAN_KEY}`, 'Content-Type': 'application/json' };
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
async function call(path, init) {
const res = await fetch(API + path, { ...init, headers });
if (res.status === 429) { await sleep(60_000); return call(path, init); }
if (!res.ok) throw new Error(`${res.status} ${await res.text()}`);
return res;
}
const domains = (await readFile(process.argv[2], 'utf8')).split(/\r?\n/).filter(Boolean);
const pending = [];
for (let i = 0; i < domains.length; i += 100) {
const res = await call('/audits/batch', { method: 'POST', body: JSON.stringify({ domains: domains.slice(i, i + 100) }) });
const { data } = await res.json();
for (const r of data.results) r.error ? console.error(r.input, r.error.code) : pending.push(r);
}
while (pending.length) {
await sleep(20_000);
for (const audit of [...pending]) {
const { data } = await (await call(`/audits/${audit.id}`)).json();
if (data.status === 'completed') {
const pdf = await call(`/audits/${audit.id}/pdf`);
await writeFile(`${new URL(data.domain).hostname}.pdf`, Buffer.from(await pdf.arrayBuffer()));
console.log('OK', data.domain, data.report.rgpdScore);
} else if (data.status === 'failed') {
console.error('FAILED', data.domain, data.error);
} else continue;
pending.splice(pending.indexOf(audit), 1);
}
}
Questions, devis, recharge de crédits : support@rgpdscan.com · rgpdscan.com