---
title: "Sprint +18 #25 IV-9 — Rotation manuelle du secret HMAC d'un endpoint."
method: POST
path: "/api/v1/integrations/webhooks/{endpoint_id}/rotate-secret"
tags: ["Intégrations"]
---

# Sprint +18 #25 IV-9 — Rotation manuelle du secret HMAC d'un endpoint.

`POST /api/v1/integrations/webhooks/{endpoint_id}/rotate-secret`

## Request

- Base URL: `https://erp.eyeot.fr/api/v1`
- URL: `https://erp.eyeot.fr/api/v1/api/v1/integrations/webhooks/{endpoint_id}/rotate-secret`
- Auth: one of:
  - HTTP bearer
  - HTTP bearer

Sprint +18 #25 IV-9 — Rotation manuelle du secret HMAC d'un endpoint.

    Génère un nouveau secret (`token_urlsafe(32)`), conserve l'ancien dans
    `secret_previous` pour une **grace period** (le consumer signe encore
    valid avec l'ancien jusqu'à la prochaine rotation). La prochaine
    rotation programmée est planifiée à +90 jours (audit cyber PM-3).

    Permission dédiée `webhooks:rotate_secret` (sub-agent #1 seed) — séparée
    de `admin:settings` car action critique : rotater à mauvais escient
    casse les intégrations consumer le temps qu'ils updatent leur config.
    Step-up MFA ≤ 5 min obligatoire.

    Réponse : `{secret: <new>, secret_rotated_at, next_rotation_due_at}`.
    Le nouveau secret n'est retourné qu'une seule fois ici — l'admin DOIT
    le copier maintenant (cf modèle WebhookEndpoint qui ne le réexpose plus).

    R314 (audit iPaaS BUG-INT-7) — accepte `grace_hours` (body) pour
    contrôler la fenêtre de validité du secret précédent (défaut 24h, max
    168h = 7j). Réponse enrichie avec `secret_previous_expires_at`.

**Permissions requises** : `webhooks:rotate_secret`

## Response `200`

Succès — payload `{data, meta}` (cf. API-GUIDE §3.1)

## Other responses

- `201`: Ressource créée. ID dans `data.id`.
- `400`: Validation Marshmallow échouée. `errors` détaille chaque champ invalide.
- `401`: JWT manquant, expiré ou révoqué.
- `402`: L'organisation n'a pas d'abonnement actif (paywall). Rediriger vers /activate.
- `403`: Permissions `module:action` insuffisantes pour cette route.
- `404`: Ressource introuvable (ou cross-tenant — équivalent à hidden).
- `409`: État incohérent (email dupliqué, ressource déjà dans cet état, etc.).
- `422`: Validation Marshmallow échouée. `errors` détaille chaque champ invalide.
- `429`: Trop de requêtes. Honorer le header `Retry-After` (secondes).

---

[API](https://skmtc.dev/eyeot/apis/eyeot-erp-api.md) · [All operations](https://skmtc.dev/eyeot/apis/eyeot-erp-api/llms.txt) · [OpenAPI document](https://skmtc.dev/eyeot/apis/eyeot-erp-api/revisions/42ab95222a89?raw)
