Router — API d'audit
Chaque appel POST /chat/completions et POST /embeddings génère une entrée d'audit encrypted-at-rest (Cloak AES-256-GCM) contenant :
- Le
request_id(même que leidde la réponse chat) - Le contenu original chiffré (90 jours de rétention)
- Le contenu redacté envoyé au modèle
- La liste des détections : detector, catégorie, sévérité, positions, label de redaction
Utilisez l'API d'audit pour :
- Compliance dashboards — surfacer à vos utilisateurs quelles PII ont été protégées
- Debugging — pourquoi une requête a été bloquée ? Quelle détection a fired ?
- Monitoring — pic de détections critiques → investiguer un pipeline qui fuit
Récupérer un audit par request_id
curl https://router.signalorange.ca/api/v1/router/audit/chatcmpl-abc123 \
-H "Authorization: Bearer $ROUTER_API_KEY"
Réponse :
{
"request_id": "chatcmpl-abc123",
"policy_id": 42,
"detections_count": 2,
"halted": false,
"inserted_at": "2026-04-21T12:34:56Z",
"detections": [
{
"detector": "regex:nas",
"category": "pii",
"severity": "critical",
"redacted_snippet": "[REDACTED:NAS]",
"position_start": 23,
"position_end": 34
},
{
"detector": "entity:email",
"category": "pii",
"severity": "high",
"redacted_snippet": "[REDACTED:EMAIL]",
"position_start": 58,
"position_end": 75
}
]
}
404 si le request_id n'existe pas OU s'il appartient à une autre organisation. Pas de distinction → pas de leak d'information cross-tenant.
Lister les audits récents
curl "https://router.signalorange.ca/api/v1/router/audit?limit=50" \
-H "Authorization: Bearer $ROUTER_API_KEY"
Filtres disponibles
| Query param | Valeurs | Effet |
|---|---|---|
limit |
1-500 (default 50) | Max rows retournées |
offset |
>= 0 | Skip N lignes (pagination) |
halted_only |
true |
Uniquement les requêtes bloquées (mode strict) |
min_severity |
critical / high / medium / low |
Au moins une détection à ce niveau ou plus élevé |
from |
ISO-8601 datetime | inserted_at >= from (inclusif) |
to |
ISO-8601 datetime | inserted_at < to (exclusif) |
Exemples
# Uniquement les halt critical du jour
curl "https://router.signalorange.ca/api/v1/router/audit?halted_only=true&min_severity=critical&from=2026-04-21T00:00:00Z" \
-H "Authorization: Bearer $ROUTER_API_KEY"
# Pagination — page 2 de 50
curl "https://router.signalorange.ca/api/v1/router/audit?limit=50&offset=50" \
-H "Authorization: Bearer $ROUTER_API_KEY"
# Fenêtre temporelle précise
curl "https://router.signalorange.ca/api/v1/router/audit?from=2026-04-20T09:00:00Z&to=2026-04-20T17:00:00Z" \
-H "Authorization: Bearer $ROUTER_API_KEY"
Format de réponse
{
"data": [
{"request_id": "...", "detections_count": 3, "halted": false, "detections": [...]},
...
],
"meta": {
"count": 50,
"limit": 50,
"offset": 0,
"retention_days": 90
}
}
Privacy-by-design — pourquoi pas d'original_snippet
L'API ne retourne jamais le contenu sensible pré-redaction. Seulement :
redacted_snippet(ex:[REDACTED:NAS])- positions dans le texte original
- catégorie + sévérité + détecteur
Pourquoi ? Si un attaquant compromet une clé API Router, retourner les originaux transformerait l'audit en oracle pour extraire les PII historiques. Le choix est de rendre l'audit utilisable pour la compliance et le debug sans faire de l'audit lui-même une surface d'attaque.
Les originaux (Cloak-chiffrés AES-256-GCM en base) restent accessibles via l'UI admin /settings/guard → audit détaillé, avec vérification de session + rôle super-admin. Ce mécanisme a ses propres logs d'accès et est sur un plan de contrôle distinct de la clé API.
Rétention
90 jours. Un Oban sweeper (GuardAuditSweeperWorker) tourne chaque jour à 03:30 UTC et supprime les lignes plus vieilles. Rétention non-configurable côté client — obligation Loi 25 / PIPEDA de ne pas garder les PII indéfiniment.
Événements liés
guard.haltwebhook — pour réagir en temps réel aux halts en mode strict au lieu de polling l'audit. Voir Router — Webhooks.- Audits dans l'UI —
/settings/guardaffiche les 10 derniers audits avec preview de détections, avec lien vers le détail (décryption des originaux réservée aux admins).
Et après ?
- Router — Guard — configuration des détecteurs et politiques
- Router — Webhooks — événements en push
- Router — Codes d'erreur — 412
guard_haltet ses détections