Router

Router — API d'audit

Inspection programmatique de ce que Guard a détecté et redacté sur chaque requête. Rétention 90 jours, Cloak-chiffré, cross-org isolated, filtres par sévérité et statut halted.

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 le id de 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.halt webhook — 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/guard affiche 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 ?