Scan de conformité Loi 25 en un seul appel. Conçu pour les bots, assistants IA, scripts et outils d'automatisation. Aucune clé API requise.
Base URL : https://veridy.ca/api · Format : JSON · Langue : fr-CA
# Scanner un site — 1 ligne, résultat complet curl -s -X POST https://veridy.ca/api/v1/scan \ -H "Content-Type: application/json" \ -d '{"url": "example.ca"}' | python3 -m json.tool
POST https://veridy.ca/api/v1/scan
Lance un scan Loi 25 et attend le résultat. Tout arrive en une seule réponse JSON.
| Champ | Type | Requis | Description |
|---|---|---|---|
| url | string | ✅ | URL à scanner (example.ca ou https://example.ca) |
| force | boolean | ❌ | true = force un re-scan. Défaut: false |
{
"url": "https://example.ca",
"company_name": "Example Inc.",
"loi25_grade": "C",
"transparency_score": 62,
"violations_count": 4,
"violations": [ {"category": "cookies", ...}, ... ],
"recommendations": [ {"priority": "high", ...}, ... ],
"source": "live_scan", // ou "db_cache"
"cached": false,
"audit_date": "2026-07-31T...",
"scanner": {
"technologies": ["Google Analytics", "Meta Pixel"],
"privacy_policy": { "found": true, "url": "/confidentialite" }
},
"evidence": {
"cmp": {}, "security_headers": {}, "infrastructure": {}
},
"rprp": {
"name": "Jean Tremblay", "email": "jt@example.ca",
"has_dpo": true, "email_provider": "Microsoft 365"
}
}
| Code | Cause |
|---|---|
| 400 | URL manquante, invalide ou bloquée (IP privée, réseau social) |
| 429 | Limite quotidienne atteinte (5 scans/jour/IP pour nouveaux sites) |
| 502 | Le scanner n'a pas pu analyser le site (site hors-ligne, etc.) |
| 504 | Timeout — le scan a dépassé 120 secondes |
POST https://veridy.ca/api/scan/start
Démarre un scan en arrière-plan. Retourne un job_id à poller avec /api/scan/status.
| Champ | Type | Requis | Description |
|---|---|---|---|
| url | string | ✅ | URL à scanner |
| force | boolean | ❌ | true = bypass du cooldown |
{
"job_id": "550e8400-e29b-41d4-a716-446655440000",
"status": "queued",
"remaining_today": 4,
"max_per_day": 5
}
GET https://veridy.ca/api/scan/status?job_id=...
| Paramètre | Type | Requis | Description |
|---|---|---|---|
| job_id | string | ✅ | Job ID obtenu via /api/scan/start |
Le champ status passe de queued → running → completed (ou failed). Quand completed, le résultat complet est dans result.
GET https://veridy.ca/api/companies/lookup?url=...
Recherche une entreprise dans le registre par URL (88 373 entreprises).
curl https://veridy.ca/api/companies/lookup?url=example.ca
GET https://veridy.ca/api/registre
Registre public des entreprises scannées (limite 100, triées par score).
curl https://veridy.ca/api/registre | python3 -m json.tool | head -30
GET https://veridy.ca/api/health
{ "status": "ok", "db": "connected", "companies": 88373 }
| Règle | Valeur |
|---|---|
| Nouveaux sites / jour / IP | 5 |
| Cooldown re-scan même site | 1 heure |
| Scans simultanés | 1 max |
| Durée max d'un scan synchrone | 120 secondes |
| Sites déjà en DB | Illimité (lecture cache) |
| Bloqués | IPs privées, localhost, Facebook/LinkedIn/Wikipedia |
curl -s -X POST https://veridy.ca/api/v1/scan \ -H "Content-Type: application/json" \ -d '{"url": "bouchardavocats.ca"}' | jq .loi25_grade # → "C"
import requests resp = requests.post( "https://veridy.ca/api/v1/scan", json={"url": "bouchardavocats.ca"}, timeout=120 ) data = resp.json() print(f"Grade: {data['loi25_grade']} ({data['transparency_score']}/100)") print(f"Violations: {data['violations_count']}") print(f"Technologies: {data['scanner']['technologies']}")
const res = await fetch("https://veridy.ca/api/v1/scan", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ url: "bouchardavocats.ca" }) }); const data = await res.json(); console.log(`Grade: ${data.loi25_grade} (${data.transparency_score}/100)`);
Veridy.ca — API sans clé, auto-hébergée au Québec. llms.txt · llms-full.txt · Méthodologie · Sous-traitants