API REST v1
Lancez des évaluations de conformité de niveau RSSI et des analyses passives de site depuis vos propres outils, vos chaînes d'intégration ou vos produits. Tous les points d'entrée répondent en JSON.
Authentification
Créez une clé dans Tableau de bord, clés d'API (compte gratuit requis, 10 clés actives au maximum), puis envoyez-la comme jeton Bearer. Une clé n'est affichée qu'à sa création et stockée sous forme d'empreinte. Chaque clé a une limite par minute ; la dépasser renvoie 429.
Authorization: Bearer sk_sc_...POST /api/v1/assess
Portée : assess. Sans answers, renvoie la banque de questions des domaines demandés. Avec answers, renvoie les notes, les mentions, le détail par catégorie, les recommandations d'expert et les lois applicables.
curl -X POST https://structureclerk.ca/api/v1/assess \
-H "Authorization: Bearer sk_sc_..." \
-H "Content-Type: application/json" \
-d '{
"domains": ["data_protection", "cybersecurity"],
"jurisdictions": ["CA_QC", "EU"],
"answers": {
"data_protection": { "dp_1": true, "dp_2": "partial" }
}
}'{
"overallScore": 62,
"grade": "B-",
"domains": {
"data_protection": {
"score": 62,
"answeredQuestions": 2,
"categoryScores": { "...": { "percentage": 50 } },
"topRecommendations": [
{
"questionId": "dp_2",
"title": "…",
"advice": "…",
"quickWin": "…",
"effort": "medium",
"impact": "high",
"timeline": "30 jours"
}
]
}
},
"applicableLaws": [
{ "jurisdiction": "Québec", "law": "Loi 25", "domain": "data_protection" }
]
}POST /api/v1/scan
Portée : scan. Analyse passive de conformité d'un site : HTTPS, détection de politique de confidentialité, bandeau de témoins, en-têtes de sécurité HTTP, coordonnées. Pages publiques seulement, aucune intrusion, aucun test actif.
curl -X POST https://structureclerk.ca/api/v1/scan \
-H "Authorization: Bearer sk_sc_..." \
-H "Content-Type: application/json" \
-d '{ "url": "https://www.example.com" }'{
"url": "https://www.example.com",
"overallScore": 75,
"checks": {
"https": { "passed": true, "details": "…" },
"privacyPolicy": { "found": true, "url": "…", "details": "…" },
"cookieBanner": { "detected": false, "details": "…" },
"securityHeaders": { "score": 57, "headers": { "…": {} }, "details": "…" },
"contactInfo": { "found": true, "details": "…" }
},
"recommendations": ["…"]
}Gestion des clés
Points d'entrée authentifiés par session (navigateur), derrière l'interface du tableau de bord :
GET /api/v1/keys· lister vos clés (préfixes seulement)POST /api/v1/keys· créer une clé ({ "name": "...", "scopes": ["assess","scan","authority"] })DELETE /api/v1/keys/:id· désactiver une clé
Points d'entrée gratuits
Publics, sans clé, sans crédit. Ils étaient livrés sans être documentés ici, ce qui revient à ne pas les avoir livrés.
GET /api/v1/pricing· la grille tarifaire en direct : coût en crédits par point d'entrée, recharges, franchise quotidienne. Lisible par une machine, et la source que lit cette documentation.GET /api/v1/authority/verify/:evidence_id· vérifier la signature Ed25519 d'une décision. Gratuit et sans compte, définitivement.GET /api/v1/authority/verify/anchors· les ancres publiées du journal chaîné des décisions, pour un contrôle par un tiers.GET /api/v1/authority/stats· les compteurs agrégés de décisions. Aucun contenu de décision, aucun identifiant.
Crédits et franchise gratuite
Les points d'entrée payants sont mesurés en crédits prépayés, la franchise quotidienne étant consommée d'abord. Les refus ci-dessous sont ceux que vous recevrez réellement ; l'ordre complet de résolution, les prix et les en-têtes de réponse sont sur la page Facturation.
Erreurs
| Statut | Code | Signification |
|---|---|---|
| 401 | unauthorized / invalid_api_key | Clé absente, invalide ou expirée |
| 403 | forbidden | La clé n'a pas la portée requise |
| 429 | rate_limited | Limite par clé et par minute dépassée |
| 403 | insufficient_scope | Clé valide, mauvaise portée. Le corps nomme la portée requise et les portées accordées. |
| 429 | free_tier_exhausted | Appelant anonyme au-delà de la franchise quotidienne. Utilisez une clé, ou rechargez. |
| 402 | insufficient_credits | Solde trop bas. Le corps porte le solde, le montant requis et une URL de recharge. |
| 503 | metering_unavailable | Compteur d'usage injoignable. Les appels anonymes sont refusés ; les détenteurs de clé sont servis et débités directement. |
| 413 | Request too large | Corps au-delà de la limite du point d'entrée, mesuré et non déclaré. |
| 400 | invalid_input | Corps mal formé : voir le champ message |