
# Déclencheurs webhook et cron

Les deux déclencheurs qui se déclenchent sans que personne n'utilise votre application : un système externe qui appelle, ou l'horloge.

## Déclencheur webhook

Expose un point de terminaison HTTP à `/api/automations/{name}/webhook` qui démarre l'automatisation lorsqu'il est atteint.

```yaml
trigger:
  type: webhook
  method: [POST]
  auth: { type: hmac, secret: $env.STRIPE_SIGNING_SECRET, algorithm: sha256 }
  deduplicationKey: '{{trigger.data.body.id}}'
  deduplicationWindow: 600
```

| Propriété             | Description                                                                                               |
| --------------------- | --------------------------------------------------------------------------------------------------------- |
| `method`              | Méthode(s) HTTP acceptées — `GET`/`POST`/`PUT`/`PATCH`/`DELETE`, ou un tableau non vide. **Obligatoire.** |
| `secret`              | Secret pour la vérification de signature HMAC (par ex. `$env.WEBHOOK_SECRET`).                            |
| `respondImmediately`  | Lorsque `true`, répond `202` immédiatement. Omis, la requête **attend la fin de l'exécution**.            |
| `auth`                | Configuration d'auth entrante — `type` vaut `bearer`, `apiKey`, `hmac` ou `basic` (voir ci-dessous).      |
| `response`            | Réponse personnalisée : `statusCode` ou `status` (100–599), `body` (modèle ou objet), `headers`.          |
| `requestSchema`       | JSON Schema validant le corps de la requête.                                                              |
| `querySchema`         | JSON Schema validant les paramètres de requête.                                                           |
| `rateLimit`           | `{ maxRequests, windowSeconds }` — `window` est accepté comme alias de `windowSeconds`.                   |
| `deduplicationKey`    | Modèle calculant une clé de déduplication (par ex. `"{{trigger.data.body.orderId}}"`).                    |
| `deduplicationWindow` | Fenêtre de déduplication en secondes. Par défaut `300`.                                                   |

:::callout
**`respondImmediately` est désactivé par défaut — l'appelant attend.** L'omettre emprunte le chemin synchrone : une automatisation lente devient donc une réponse HTTP lente pour l'expéditeur. Passez-le à `true` pour les récepteurs « tire et oublie » (Stripe, GitHub) qui n'attendent qu'un `202` rapide.
:::

### Authentification entrante

`auth.type` vaut `bearer`, `apiKey`, `hmac` ou `basic`. Les champs d'identifiants — `token`, `prefix`, `key`, `header`, `secret`, `algorithm`, `username`, `password` — sont **tous optionnels et non conditionnés par `type`**, et `algorithm` est une chaîne libre plutôt qu'une énumération. Rien ne vérifie qu'un bloc `bearer` porte effectivement un `token` : un bloc incomplet passe `sovrium validate` et échoue à la réception. Toutes les valeurs d'identifiants acceptent `$env.VAR`.

### Contexte du webhook

La charge utile n'est **pas** à `{{trigger.body}}`. Les chemins disponibles sont `{{trigger.data.body.*}}`, `{{trigger.data.headers.*}}`, `{{trigger.data.query.*}}`, ainsi que `{{trigger.data.method}}`, `{{trigger.data.path}}` et `{{trigger.data.ip}}`. Les champs scalaires du corps sont en outre aplatis vers `{{trigger.data.<champ>}}`.

## Déclencheur cron

Exécute l'automatisation selon une planification.

```yaml
trigger:
  type: cron
  expression: '0 9 * * 1-5'
  timezone: Europe/Paris
```

| Propriété    | Description                                                                                               |
| ------------ | --------------------------------------------------------------------------------------------------------- |
| `expression` | Expression cron — 5 champs standard, ou 6 champs avec les secondes. **Obligatoire.** Validée au décodage. |
| `timezone`   | Fuseau IANA (par ex. `America/New_York`). Par défaut `UTC`. Validé contre la base IANA.                   |

Il n'existe **aucun alias `@daily` / `@hourly` / `@weekly`** — écrivez l'équivalent numérique (`0 0 * * *`, `0 * * * *`). Un pas de zéro (`*/0`) est rejeté. Comme l'expression et le fuseau sont validés hors ligne, une faute de frappe échoue à `sovrium validate` au lieu de produire une automatisation qui ne s'exécute jamais en silence.

Définissez `timezone` dès que la planification doit suivre des horaires humains : `0 9 * * 1-5` en `UTC` dérive d'une heure par rapport à Paris deux fois par an, tandis que la même expression en `Europe/Paris` reste à 09h00 locales de part et d'autre des changements d'heure.

## Pages connexes

- [Présentation des déclencheurs](/fr/docs/automation-triggers) — les neuf types en un coup d'œil.
- [Actions HTTP et webhook](/fr/docs/automation-http-actions) — appeler _vers l'extérieur_, et l'action `webhook/response`.
- [Webhooks de table](/fr/docs/table-webhooks) — les webhooks _sortants_, la direction inverse.
- [Exécutions d'automatisation](/fr/docs/automation-runs) — inspecter et rejouer ce qu'un déclencheur a démarré.
- [Variables d'environnement](/fr/docs/env-vars) — les valeurs `$env.VAR` lues par les identifiants.
