# Automatisations API

> Construisez des workflows à partir de déclencheurs et d’étapes, lancez-les et consultez leurs exécutions.

URL de base : `https://api.emailit.com/v2`. Authentifiez-vous avec `Authorization: Bearer <API key>`.

## Créer une automatisation — POST /automations

> Créez une automatisation à l’état de brouillon à partir d’un graphe d’étapes de déclenchement et d’action, comme un e-mail de bienvenue envoyé lorsqu’un contact rejoint une liste de contacts.

# Créer une automatisation

Crée une automatisation au statut `draft` à partir d’un graphe d’étapes et de connexions. Nécessite une clé API de portée `full`. Les automatisations sont en bêta.

L’automatisation ne fait rien tant que vous ne l’avez pas [démarrée](/fr/docs/api-reference/automations/start/). Chaque exécution coûte 3 crédits à son démarrage, et chaque e-mail envoyé par `send_email` ou `forward_email` coûte 1 crédit de plus. Dans un espace de travail non vérifié, ces actions ne peuvent envoyer qu’aux adresses e-mail de compte des membres de l’espace de travail.

`POST /automations`

## Paramètres du corps

- `context` (string, obligatoire): Ce sur quoi porte chaque exécution : `contact`, `email` ou `event`. Le contexte détermine les déclencheurs et les actions utilisables, et ne peut pas être modifié par la suite. Consultez [Contextes](#contexts).

- `name` (string, obligatoire): Nom de l’automatisation, 191 caractères au maximum.

- `description` (string | null): Description facultative.

- `settings` (object): Règles d’exécution. Consultez [Paramètres](#settings).

- `steps` (object[], obligatoire): Les étapes de déclenchement et d’action, dont au moins un déclencheur. Consultez [Étapes](#steps).

- `connections` (object[], obligatoire): Les liens entre les étapes. Transmettez `[]` pour un graphe qui ne contient qu’un déclencheur. Consultez [Connexions](#connections).

### Paramètres

- `on_step_failure` (string): `stop` fait passer l’exécution à `failed` lorsqu’une étape échoue. `skip` enregistre l’étape en échec et laisse le reste de l’exécution se terminer.

- `allow_reentry` (boolean): `false` ignore un déclenchement lorsque le même contact (ou e-mail) a déjà une exécution en cours dans cette automatisation.

- `max_concurrent_runs` (integer): Nombre maximal d’exécutions simultanées au statut `running`. `0` signifie aucune limite.

- `cooldown_seconds` (integer): Ignore un déclenchement lorsque le même contact (ou e-mail) a démarré une exécution dans cette automatisation au cours de ce nombre de secondes.

### Étapes

- `key` (string, obligatoire): Votre identifiant pour l’étape, unique dans l’automatisation, par exemple `welcome_email`. Les connexions, les [statistiques d’étape](/fr/docs/api-reference/automations/step-stats/) et les mises à jour désignent les étapes par leur clé.

- `type` (string, obligatoire): `trigger` ou `action`.

- `trigger` (string): Nom du déclencheur, obligatoire lorsque `type` vaut `trigger`. Consultez [Déclencheurs](#triggers).

- `action` (string): Nom de l’action, obligatoire lorsque `type` vaut `action`. Consultez [Actions](#actions).

- `config` (object): Paramètres du déclencheur ou de l’action.

### Connexions

- `from` (string, obligatoire): Clé de l’étape de départ du lien.

- `to` (string, obligatoire): Clé de l’étape suivante.

- `branch` (string): L’issue de l’étape `from` qui emprunte ce lien. Les étapes `condition` utilisent `yes` et `no` ; les étapes `experiment` utilisent les clés de variante. Toutes les autres étapes utilisent `default`.

## Contextes

| Contexte | Une exécution porte sur | Déclencheurs | Règles |
| --- | --- | --- | --- |
| `contact` | Un contact. `send_email` envoie à ce contact. | `contact.*`, `system.*` | Un ou plusieurs déclencheurs. Ils doivent tous être connectés à la même première action. |
| `email` | Un e-mail (envoyé ou reçu). | `email.*`, `system.*` | Un ou plusieurs déclencheurs. Ils doivent tous être connectés à la même première action. |
| `event` | Le payload du déclencheur uniquement. | `event.*`, `system.*` | Exactement un déclencheur. |

Chaque action doit être accessible depuis un déclencheur. Une exécution commence à l’action connectée au déclencheur qui s’est activé, puis suit les connexions :

- `condition` ne suit que le lien dont la `branch` vaut `yes` ou `no`, selon le résultat.
- `experiment` suit les liens de la variante choisie. Lorsque ce chemin se termine, l’exécution continue sur les liens `default` de l’étape d’expérimentation.
- `wait` retarde l’étape suivante.
- Toutes les autres actions suivent leurs liens `default`. Une étape qui a plusieurs liens sortants les exécute tous.

Une exécution passe à `completed` lorsqu’il ne reste plus d’étapes, à `failed` lorsqu’une étape échoue (avec `on_step_failure: "stop"`), et à `canceled` lorsque vous [arrêtez l’automatisation](/fr/docs/api-reference/automations/stop/).

## Déclencheurs

| Déclencheur | Contexte | S’active lorsque |
| --- | --- | --- |
| `contact.added_to_audience` | contact | Un contact s’inscrit à une liste de contacts, y compris lors d’une réinscription. |
| `contact.removed_from_audience` | contact | Un abonné est supprimé d’une liste de contacts. |
| `contact.updated` | contact | Un contact est mis à jour. |
| `contact.loaded_email` | contact | Un destinataire qui est un contact de l’espace de travail ouvre un e-mail. |
| `contact.clicked_in_email` | contact | Un destinataire qui est un contact de l’espace de travail clique sur un lien suivi. |
| `contact.date_anniversary` | contact | Chaque jour à 0 h 00 UTC, pour les contacts dont le champ personnalisé de type date (`YYYY-MM-DD`) a le même mois et le même jour qu’aujourd’hui. |
| `contact.on_date` | contact | Chaque jour à 0 h 00 UTC, pour les contacts dont le champ personnalisé de type date correspond à la date du jour. |
| `contact.visits_url`, `contact.on_purchase`, `contact.on_event` | contact | Acceptés, mais Emailit ne les active pas encore. |
| `email.received` | email | Un e-mail entrant arrive. |
| `email.delivered`, `email.bounced`, `email.complained`, `email.loaded`, `email.clicked`, `email.failed`, `email.suppressed`, `email.canceled` | email | L’événement e-mail du même nom se produit. |
| `event.<name>` | event | Tout nom qui commence par `event.`. Emailit n’émet pas encore d’événements `event.*` ; démarrez les automatisations d’événement avec `system.manual`. |
| `system.manual` | tous | Vous appelez [Déclencher une exécution](/fr/docs/api-reference/automations/trigger/). |
| `system.schedule` | tous | Accepté, mais Emailit n’active pas encore les déclencheurs programmés. |

Champs de `config` des déclencheurs :

- `audience_id` (string): Pour `contact.added_to_audience` et `contact.removed_from_audience` : s’active uniquement pour cette liste de contacts (`aud_…`).

- `date_field` (string): Pour `contact.date_anniversary` et `contact.on_date` : la clé du [champ personnalisé](/fr/docs/contacts/custom-fields/) qui contient la date, par exemple `birthday`.

- `filter` (object): S’active uniquement lorsque l’événement correspond : `{ "match": "all", "rules": [{ "field": "subject", "operator": "contains", "value": "Invoice" }] }`. `match` vaut `all` (par défaut) ou `any`. `field` est un chemin à points dans l’`object` de l’événement, par exemple `to` ou `email.subject` ; un préfixe `payload.` est ignoré. Opérateurs : `equals`, `not_equals`, `contains`, `not_contains`, `starts_with`, `ends_with`, `greater_than`, `less_than`, `in`, `not_in`, `is_set`, `is_not_set`. Tous les opérateurs sauf `is_set` et `is_not_set` nécessitent une `value` ; `in` et `not_in` prennent un tableau.

## Actions

| Action | Contexte | Configuration |
| --- | --- | --- |
| `send_email` | tous | `type` (obligatoire, `template`), `template_id` (obligatoire : un ID `tem_` ou l’alias d’un modèle publié), `from`, `subject`, `reply_to`, `to` |
| `forward_email` | email, event | `to` (obligatoire), `from`, `subject`, `email_id` |
| `wait` | tous | `seconds` (obligatoire, de 0 à 2 592 000, soit 30 jours) |
| `condition` | tous | `filter` (obligatoire, voir ci-dessous) |
| `experiment` | tous | `variants` (obligatoire), `control` |
| `call_webhook` | tous | `url` (obligatoire), `method`, `headers`, `body` |
| `run_automation` | tous | `automation_id` (obligatoire) |
| `end` | tous | Aucune |
| `add_to_audience` | contact | `audience_id` (obligatoire) |
| `remove_from_audience` | contact | `audience_id` (obligatoire) |
| `edit_contact` | contact | `fields` (obligatoire) |
| `add_to_suppressions` | email, event | `type`, `reason`, `email` |
| `remove_from_suppressions` | email, event | `email` |
| `create_contact` | email, event | `email`, `first_name`, `audience_id` |

- **`send_email`** envoie le modèle. `from` vaut par défaut l’expéditeur du modèle et doit appartenir à un domaine d’envoi vérifié. `subject` remplace l’objet du modèle. `reply_to` est une adresse ou un tableau d’adresses. Dans le contexte `contact`, l’e-mail est envoyé au contact de l’exécution ; dans les contextes `email` et `event`, définissez `to`.
- **`forward_email`** transfère l’e-mail de l’exécution (ou l’e-mail indiqué dans `email_id`) à `to`. `from` vaut par défaut l’expéditeur d’origine et `subject`, `Fwd: <original subject>`.
- **`condition`** prend `{ "match": "all" | "any", "rules": [...] }` avec les mêmes opérateurs que les filtres de déclencheur. Les champs sans préfixe sont résolus par rapport au contact (`first_name`, `custom_fields.plan`) ou à l’e-mail (`rcpt_to`, `subject`) de l’exécution ; préfixez un champ par `contact.`, `email.`, `payload.` ou `meta.` pour être explicite. L’étape continue sur `yes` ou `no`.
- **`experiment`** choisit l’une des `variants` (`control` compris), chacune de la forme `{ "key": "a", "weight": 50 }`, au hasard selon leur poids, et continue sur la branche qui porte le nom de la clé choisie.
- **`call_webhook`** envoie une requête HTTP (méthode `POST` par défaut, `Content-Type` JSON) et enregistre la classe de statut (`2xx`, `4xx`, `5xx`), ou `timeout` ou `network_error`. Une réponse autre que 2xx ne fait pas échouer l’étape.
- **`run_automation`** démarre une exécution d’une autre automatisation active avec le payload de cette exécution. L’exécution en cours continue.
- **`edit_contact`** prend `fields: [{ "key": "first_name", "value": "Ada" }]`. Les clés `email`, `first_name`, `last_name` et `unsubscribed` mettent à jour le contact ; toute autre clé définit un champ personnalisé.
- **`add_to_suppressions`** bloque l’adresse de l’exécution (`type` par défaut : `recipient` ; `reason` par défaut : `automation`). **`remove_from_suppressions`** la retire des adresses bloquées. Dans le contexte `event`, transmettez `email`.
- **`create_contact`** crée le contact (ou retrouve le contact existant) et l’inscrit éventuellement à `audience_id`. Dans le contexte `email`, `email` vaut par défaut le destinataire de l’e-mail.

Les valeurs de type chaîne de toute configuration d’action peuvent contenir des variables qu’Emailit remplace lors de l’exécution de l’étape : `{{contact.email}}`, `{{email.mail_from}}`, `{{payload.object.subject}}` ou `{{meta.source_event_id}}`, par exemple `"to": "{{email.mail_from}}"`. Les modèles envoyés par `send_email` affichent aussi directement les champs du contact, comme `{{ first_name }}`.

## Réponse

Renvoie `201 Created` avec l’automatisation dans `data`, y compris l’ID de chaque étape (`aus_…`) et les connexions. `status` vaut `draft`.

La création vérifie la structure du graphe : noms des déclencheurs et des actions pour le contexte, unicité des clés, validité des connexions, accessibilité des étapes, et utilisation d’un domaine d’envoi vérifié pour toute adresse `from` d’une action `send_email`. Elle ne vérifie pas que la configuration de chaque action est complète ; [Mettre à jour une automatisation](/fr/docs/api-reference/automations/update/) le fait. Les erreurs renvoient `400` avec `errors` indexé par chemin de champ.

**Requête** `POST /automations`

**cURL**

```bash
curl -X POST https://api.emailit.com/v2/automations \
  -H "Authorization: Bearer $EMAILIT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Welcome series",
    "context": "contact",
    "description": "Welcome new subscribers, then nudge free users a day later.",
    "settings": { "allow_reentry": false },
    "steps": [
      {
        "key": "joined",
        "type": "trigger",
        "trigger": "contact.added_to_audience",
        "config": { "audience_id": "aud_3Cz7WJ9GpvD7P0PQez50xOmkZSV" }
      },
      {
        "key": "welcome_email",
        "type": "action",
        "action": "send_email",
        "config": { "type": "template", "template_id": "welcome", "from": "Acme <hello@acme.com>" }
      },
      {
        "key": "wait_1_day",
        "type": "action",
        "action": "wait",
        "config": { "seconds": 86400 }
      },
      {
        "key": "is_free_user",
        "type": "action",
        "action": "condition",
        "config": {
          "filter": {
            "match": "all",
            "rules": [{ "field": "custom_fields.plan", "operator": "is_not_set" }]
          }
        }
      },
      {
        "key": "upgrade_tips",
        "type": "action",
        "action": "send_email",
        "config": { "type": "template", "template_id": "getting-started-tips" }
      },
      { "key": "done", "type": "action", "action": "end" }
    ],
    "connections": [
      { "from": "joined", "to": "welcome_email" },
      { "from": "welcome_email", "to": "wait_1_day" },
      { "from": "wait_1_day", "to": "is_free_user" },
      { "from": "is_free_user", "to": "upgrade_tips", "branch": "yes" },
      { "from": "is_free_user", "to": "done", "branch": "no" }
    ]
  }'
```

**Node.js**

```javascript
const res = await fetch('https://api.emailit.com/v2/automations', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.EMAILIT_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    name: 'Welcome series',
    context: 'contact',
    description: 'Welcome new subscribers, then nudge free users a day later.',
    settings: { allow_reentry: false },
    steps: [
      {
        key: 'joined',
        type: 'trigger',
        trigger: 'contact.added_to_audience',
        config: { audience_id: 'aud_3Cz7WJ9GpvD7P0PQez50xOmkZSV' },
      },
      {
        key: 'welcome_email',
        type: 'action',
        action: 'send_email',
        config: { type: 'template', template_id: 'welcome', from: 'Acme <hello@acme.com>' },
      },
      { key: 'wait_1_day', type: 'action', action: 'wait', config: { seconds: 86400 } },
      {
        key: 'is_free_user',
        type: 'action',
        action: 'condition',
        config: {
          filter: { match: 'all', rules: [{ field: 'custom_fields.plan', operator: 'is_not_set' }] },
        },
      },
      {
        key: 'upgrade_tips',
        type: 'action',
        action: 'send_email',
        config: { type: 'template', template_id: 'getting-started-tips' },
      },
      { key: 'done', type: 'action', action: 'end' },
    ],
    connections: [
      { from: 'joined', to: 'welcome_email' },
      { from: 'welcome_email', to: 'wait_1_day' },
      { from: 'wait_1_day', to: 'is_free_user' },
      { from: 'is_free_user', to: 'upgrade_tips', branch: 'yes' },
      { from: 'is_free_user', to: 'done', branch: 'no' },
    ],
  }),
});
const { data: automation } = await res.json();
```

**Python**

```python
import os, requests

r = requests.post(
    "https://api.emailit.com/v2/automations",
    headers={"Authorization": f"Bearer {os.environ['EMAILIT_API_KEY']}"},
    json={
        "name": "Welcome series",
        "context": "contact",
        "description": "Welcome new subscribers, then nudge free users a day later.",
        "settings": {"allow_reentry": False},
        "steps": [
            {
                "key": "joined",
                "type": "trigger",
                "trigger": "contact.added_to_audience",
                "config": {"audience_id": "aud_3Cz7WJ9GpvD7P0PQez50xOmkZSV"},
            },
            {
                "key": "welcome_email",
                "type": "action",
                "action": "send_email",
                "config": {"type": "template", "template_id": "welcome", "from": "Acme <hello@acme.com>"},
            },
            {"key": "wait_1_day", "type": "action", "action": "wait", "config": {"seconds": 86400}},
            {
                "key": "is_free_user",
                "type": "action",
                "action": "condition",
                "config": {
                    "filter": {
                        "match": "all",
                        "rules": [{"field": "custom_fields.plan", "operator": "is_not_set"}],
                    }
                },
            },
            {
                "key": "upgrade_tips",
                "type": "action",
                "action": "send_email",
                "config": {"type": "template", "template_id": "getting-started-tips"},
            },
            {"key": "done", "type": "action", "action": "end"},
        ],
        "connections": [
            {"from": "joined", "to": "welcome_email"},
            {"from": "welcome_email", "to": "wait_1_day"},
            {"from": "wait_1_day", "to": "is_free_user"},
            {"from": "is_free_user", "to": "upgrade_tips", "branch": "yes"},
            {"from": "is_free_user", "to": "done", "branch": "no"},
        ],
    },
)
automation = r.json()["data"]
```

**PHP**

```php
$client = new GuzzleHttp\Client(['base_uri' => 'https://api.emailit.com/v2/']);

$response = $client->post('automations', [
    'headers' => ['Authorization' => 'Bearer ' . getenv('EMAILIT_API_KEY')],
    'json' => [
        'name' => 'Welcome series',
        'context' => 'contact',
        'description' => 'Welcome new subscribers, then nudge free users a day later.',
        'settings' => ['allow_reentry' => false],
        'steps' => [
            [
                'key' => 'joined',
                'type' => 'trigger',
                'trigger' => 'contact.added_to_audience',
                'config' => ['audience_id' => 'aud_3Cz7WJ9GpvD7P0PQez50xOmkZSV'],
            ],
            [
                'key' => 'welcome_email',
                'type' => 'action',
                'action' => 'send_email',
                'config' => ['type' => 'template', 'template_id' => 'welcome', 'from' => 'Acme <hello@acme.com>'],
            ],
            ['key' => 'wait_1_day', 'type' => 'action', 'action' => 'wait', 'config' => ['seconds' => 86400]],
            [
                'key' => 'is_free_user',
                'type' => 'action',
                'action' => 'condition',
                'config' => [
                    'filter' => [
                        'match' => 'all',
                        'rules' => [['field' => 'custom_fields.plan', 'operator' => 'is_not_set']],
                    ],
                ],
            ],
            [
                'key' => 'upgrade_tips',
                'type' => 'action',
                'action' => 'send_email',
                'config' => ['type' => 'template', 'template_id' => 'getting-started-tips'],
            ],
            ['key' => 'done', 'type' => 'action', 'action' => 'end'],
        ],
        'connections' => [
            ['from' => 'joined', 'to' => 'welcome_email'],
            ['from' => 'welcome_email', 'to' => 'wait_1_day'],
            ['from' => 'wait_1_day', 'to' => 'is_free_user'],
            ['from' => 'is_free_user', 'to' => 'upgrade_tips', 'branch' => 'yes'],
            ['from' => 'is_free_user', 'to' => 'done', 'branch' => 'no'],
        ],
    ],
]);
$automation = json_decode($response->getBody(), true)['data'];
```

**201**

```json
{
  "data": {
    "id": "aut_3xqC9YD79FZZA36uTekWTBO1ghe",
    "context": "contact",
    "name": "Welcome series",
    "description": "Welcome new subscribers, then nudge free users a day later.",
    "status": "draft",
    "settings": { "allow_reentry": false },
    "last_triggered_at": null,
    "published_at": null,
    "created_at": "2026-10-01T09:41:05.318274+00:00",
    "updated_at": "2026-10-01T09:41:05.318274+00:00",
    "steps": [
      {
        "id": "aus_3ZqpuxjmL1szZ8og6uGL1mT6QEJ",
        "key": "joined",
        "type": "trigger",
        "trigger": "contact.added_to_audience",
        "action": null,
        "config": { "audience_id": "aud_3Cz7WJ9GpvD7P0PQez50xOmkZSV" }
      },
      {
        "id": "aus_3V5TZIXXak1SSmGcOmzPOeFaguQ",
        "key": "welcome_email",
        "type": "action",
        "trigger": null,
        "action": "send_email",
        "config": { "type": "template", "template_id": "welcome", "from": "Acme <hello@acme.com>" }
      },
      {
        "id": "aus_3vM0ORwEXCQcyS7rylfQBQEXjVk",
        "key": "wait_1_day",
        "type": "action",
        "trigger": null,
        "action": "wait",
        "config": { "seconds": 86400 }
      },
      {
        "id": "aus_3HOgOzxaXBgVRpLFtpvJNo4vd5c",
        "key": "is_free_user",
        "type": "action",
        "trigger": null,
        "action": "condition",
        "config": {
          "filter": {
            "match": "all",
            "rules": [{ "field": "custom_fields.plan", "operator": "is_not_set" }]
          }
        }
      },
      {
        "id": "aus_3gCI5SWMPFVhOSawR6nz8sF55wp",
        "key": "upgrade_tips",
        "type": "action",
        "trigger": null,
        "action": "send_email",
        "config": { "type": "template", "template_id": "getting-started-tips" }
      },
      {
        "id": "aus_3Pq7Wd2LxN8cVt5RmK0sHy4BfJe",
        "key": "done",
        "type": "action",
        "trigger": null,
        "action": "end",
        "config": {}
      }
    ],
    "connections": [
      { "from": "joined", "to": "welcome_email", "branch": "default" },
      { "from": "welcome_email", "to": "wait_1_day", "branch": "default" },
      { "from": "wait_1_day", "to": "is_free_user", "branch": "default" },
      { "from": "is_free_user", "to": "upgrade_tips", "branch": "yes" },
      { "from": "is_free_user", "to": "done", "branch": "no" }
    ]
  },
  "message": "Automation was successfully created.",
  "notify": true
}
```

**400**

```json
{
  "message": "Validation failed.",
  "errors": {
    "steps.1.action": ["Action \"forward_email\" is not allowed for context \"contact\"."],
    "steps": ["Action step \"upgrade_tips\" is not reachable from any trigger."]
  }
}
```

---
Source: https://emailit.com/fr/docs/api-reference/automations/create/

## Récupérer une automatisation — GET /automations/{id}

> Récupérez une automatisation avec son statut, ses paramètres, ses étapes de déclenchement et d’action, et les connexions entre ces étapes.

# Récupérer une automatisation

Récupère une automatisation avec son graphe complet. Nécessite une clé API de portée `full`.

`GET /automations/{id}`

## Paramètres de chemin

- `id` (string, obligatoire): L’ID de l’automatisation (`aut_…`).

## Réponse

Renvoie l’automatisation dans `data`.

- `id` (string): ID de l’automatisation, avec le préfixe `aut_`.

- `context` (string): `contact`, `email` ou `event`.

- `name` (string): Nom de l’automatisation.

- `description` (string | null): Description facultative.

- `status` (string): `draft`, `running`, `paused`, `stopped` ou `archived`.

- `settings` (object): Règles d’exécution : `on_step_failure`, `allow_reentry`, `max_concurrent_runs`, `cooldown_seconds`. Vide si vous n’en avez défini aucune.

- `last_triggered_at` (string | null): Date à laquelle l’automatisation a démarré une exécution pour la dernière fois.

- `published_at` (string | null): Date du premier démarrage de l’automatisation.

- `steps` (object[]): Pour chaque étape : `id` (`aus_…`), `key`, `type`, `trigger`, `action` et `config`. Les détails d’exécution désignent les étapes par leur `id` ; les statistiques, par leur `key`.

- `connections` (object[]): Pour chaque lien : les clés des étapes `from` et `to`, et sa `branch`.

Pour la signification de chaque déclencheur, action et paramètre, consultez [Créer une automatisation](/fr/docs/api-reference/automations/create/). Renvoie `404` si l’automatisation n’existe pas ou a été supprimée.

**Requête** `GET /automations/{id}`

**cURL**

```bash
curl https://api.emailit.com/v2/automations/aut_3xqC9YD79FZZA36uTekWTBO1ghe \
  -H "Authorization: Bearer $EMAILIT_API_KEY"
```

**Node.js**

```javascript
const res = await fetch('https://api.emailit.com/v2/automations/aut_3xqC9YD79FZZA36uTekWTBO1ghe', {
  headers: { Authorization: `Bearer ${process.env.EMAILIT_API_KEY}` },
});
const { data: automation } = await res.json();
```

**Python**

```python
import os, requests

r = requests.get(
    "https://api.emailit.com/v2/automations/aut_3xqC9YD79FZZA36uTekWTBO1ghe",
    headers={"Authorization": f"Bearer {os.environ['EMAILIT_API_KEY']}"},
)
automation = r.json()["data"]
```

**PHP**

```php
$client = new GuzzleHttp\Client(['base_uri' => 'https://api.emailit.com/v2/']);

$response = $client->get('automations/aut_3xqC9YD79FZZA36uTekWTBO1ghe', [
    'headers' => ['Authorization' => 'Bearer ' . getenv('EMAILIT_API_KEY')],
]);
$automation = json_decode($response->getBody(), true)['data'];
```

**200**

```json
{
  "data": {
    "id": "aut_3xqC9YD79FZZA36uTekWTBO1ghe",
    "context": "contact",
    "name": "Welcome series",
    "description": "Welcome new subscribers, then nudge free users a day later.",
    "status": "running",
    "settings": { "allow_reentry": false },
    "last_triggered_at": "2026-10-03T14:12:40.551870+00:00",
    "published_at": "2026-10-01T10:00:02.204118+00:00",
    "created_at": "2026-10-01T09:41:05.318274+00:00",
    "updated_at": "2026-10-03T14:12:40.551870+00:00",
    "steps": [
      {
        "id": "aus_3ZqpuxjmL1szZ8og6uGL1mT6QEJ",
        "key": "joined",
        "type": "trigger",
        "trigger": "contact.added_to_audience",
        "action": null,
        "config": { "audience_id": "aud_3Cz7WJ9GpvD7P0PQez50xOmkZSV" }
      },
      {
        "id": "aus_3V5TZIXXak1SSmGcOmzPOeFaguQ",
        "key": "welcome_email",
        "type": "action",
        "trigger": null,
        "action": "send_email",
        "config": { "type": "template", "template_id": "welcome", "from": "Acme <hello@acme.com>" }
      },
      {
        "id": "aus_3vM0ORwEXCQcyS7rylfQBQEXjVk",
        "key": "wait_1_day",
        "type": "action",
        "trigger": null,
        "action": "wait",
        "config": { "seconds": 86400 }
      }
    ],
    "connections": [
      { "from": "joined", "to": "welcome_email", "branch": "default" },
      { "from": "welcome_email", "to": "wait_1_day", "branch": "default" }
    ]
  }
}
```

**404**

```json
{
  "message": "Automation not found."
}
```

---
Source: https://emailit.com/fr/docs/api-reference/automations/get/

## Mettre à jour une automatisation — POST /automations/{id}

> Renommez une automatisation, modifiez ses paramètres ou remplacez son graphe d’étapes et de connexions, avec une validation complète.

# Mettre à jour une automatisation

Met à jour le nom, la description, les paramètres ou le graphe d’une automatisation. Nécessite une clé API de portée `full`. Le contexte ne peut pas être modifié.

Pour modifier le graphe, envoyez `steps` et `connections` ensemble ; ils remplacent le graphe actuel. Les étapes dont la `key` existe déjà conservent leur ID et leur historique d’exécution, les étapes que vous omettez sont supprimées, et les nouvelles clés sont ajoutées. Contrairement à la création, la mise à jour valide aussi la configuration de chaque action (par exemple, `send_email` nécessite `type` et `template_id`, et `wait` nécessite `seconds`).

[Mettez l’automatisation en pause](/fr/docs/api-reference/automations/pause/) avant de modifier le graphe d’une automatisation active, puis [démarrez-la](/fr/docs/api-reference/automations/start/) de nouveau pour que les nouveaux déclencheurs prennent effet.

`POST /automations/{id}`

## Paramètres de chemin

- `id` (string, obligatoire): L’ID de l’automatisation (`aut_…`).

## Paramètres du corps

- `name` (string): Nom, 191 caractères au maximum.

- `description` (string): Description.

- `settings` (object): Remplace tous les paramètres : `on_step_failure`, `allow_reentry`, `max_concurrent_runs`, `cooldown_seconds`. Consultez [Paramètres](/fr/docs/api-reference/automations/create/#settings).

- `steps` (object[]): La liste complète des étapes. Obligatoire lorsque vous envoyez `connections`. Consultez [Étapes](/fr/docs/api-reference/automations/create/#steps).

- `connections` (object[]): La liste complète des connexions. Obligatoire lorsque vous envoyez `steps`. Consultez [Connexions](/fr/docs/api-reference/automations/create/#connections).

## Réponse

Renvoie l’automatisation mise à jour dans `data`, avec `message` et `notify`. Renvoie `400` avec `errors` indexé par chemin de champ lorsque la validation échoue, et `404` si l’automatisation n’existe pas.

**Requête** `POST /automations/{id}`

**cURL**

```bash
curl -X POST https://api.emailit.com/v2/automations/aut_3xqC9YD79FZZA36uTekWTBO1ghe \
  -H "Authorization: Bearer $EMAILIT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Welcome series (v2)",
    "settings": { "allow_reentry": false, "on_step_failure": "skip" }
  }'
```

**Node.js**

```javascript
const res = await fetch('https://api.emailit.com/v2/automations/aut_3xqC9YD79FZZA36uTekWTBO1ghe', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.EMAILIT_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    name: 'Welcome series (v2)',
    settings: { allow_reentry: false, on_step_failure: 'skip' },
  }),
});
const { data: automation } = await res.json();
```

**Python**

```python
import os, requests

r = requests.post(
    "https://api.emailit.com/v2/automations/aut_3xqC9YD79FZZA36uTekWTBO1ghe",
    headers={"Authorization": f"Bearer {os.environ['EMAILIT_API_KEY']}"},
    json={
        "name": "Welcome series (v2)",
        "settings": {"allow_reentry": False, "on_step_failure": "skip"},
    },
)
automation = r.json()["data"]
```

**PHP**

```php
$client = new GuzzleHttp\Client(['base_uri' => 'https://api.emailit.com/v2/']);

$response = $client->post('automations/aut_3xqC9YD79FZZA36uTekWTBO1ghe', [
    'headers' => ['Authorization' => 'Bearer ' . getenv('EMAILIT_API_KEY')],
    'json' => [
        'name' => 'Welcome series (v2)',
        'settings' => ['allow_reentry' => false, 'on_step_failure' => 'skip'],
    ],
]);
$automation = json_decode($response->getBody(), true)['data'];
```

**200**

```json
{
  "data": {
    "id": "aut_3xqC9YD79FZZA36uTekWTBO1ghe",
    "context": "contact",
    "name": "Welcome series (v2)",
    "description": "Welcome new subscribers, then nudge free users a day later.",
    "status": "paused",
    "settings": { "allow_reentry": false, "on_step_failure": "skip" },
    "last_triggered_at": "2026-10-03T14:12:40.551870+00:00",
    "published_at": "2026-10-01T10:00:02.204118+00:00",
    "created_at": "2026-10-01T09:41:05.318274+00:00",
    "updated_at": "2026-10-04T08:15:22.730115+00:00",
    "steps": [
      {
        "id": "aus_3ZqpuxjmL1szZ8og6uGL1mT6QEJ",
        "key": "joined",
        "type": "trigger",
        "trigger": "contact.added_to_audience",
        "action": null,
        "config": { "audience_id": "aud_3Cz7WJ9GpvD7P0PQez50xOmkZSV" }
      },
      {
        "id": "aus_3V5TZIXXak1SSmGcOmzPOeFaguQ",
        "key": "welcome_email",
        "type": "action",
        "trigger": null,
        "action": "send_email",
        "config": { "type": "template", "template_id": "welcome", "from": "Acme <hello@acme.com>" }
      }
    ],
    "connections": [
      { "from": "joined", "to": "welcome_email", "branch": "default" }
    ]
  },
  "message": "Automation was successfully updated.",
  "notify": true
}
```

**400**

```json
{
  "message": "Validation failed.",
  "errors": {
    "steps.2.config.seconds": ["Wait seconds cannot exceed 2592000 (30 days)."],
    "steps.1.config.template_id": ["Template ID is required when type is \"template\"."]
  }
}
```

**404**

```json
{
  "message": "Automation not found."
}
```

---
Source: https://emailit.com/fr/docs/api-reference/automations/update/

## Lister les automatisations — GET /automations

> Listez les automatisations d’un espace de travail avec une pagination page et per_page, filtrées par contexte, statut ou nom.

# Lister les automatisations

Renvoie les automatisations de l’espace de travail, de la plus récente à la plus ancienne, sans leurs étapes ni leurs connexions. Nécessite une clé API de portée `full`. Les automatisations supprimées ne sont pas listées.

`GET /automations`

## Paramètres de requête

- `page` (integer): Numéro de page, à partir de 1.

- `per_page` (integer): Nombre d’automatisations par page, de 1 à 100.

- `filter[context]` (string): Uniquement les automatisations de ce contexte : `contact`, `email` ou `event`.

- `filter[status]` (string): Uniquement les automatisations de ce statut : `draft`, `running`, `paused`, `stopped` ou `archived`.

- `filter[name]` (string): Recherche insensible à la casse sur une partie du nom.

- `sort` (string): Champ de tri : `name`, `created_at`, `updated_at` ou `last_triggered_at`.

- `order` (string): Sens du tri : `asc` ou `desc`.

Vous pouvez aussi utiliser les filtres génériques `key.condition=value` sur `name`, `status`, `context` et `created_at`, avec `match`. Consultez [Filtrage et tri](/fr/docs/api-reference/filtering/).

## Réponse

- `data` (object[]): Les automatisations de cette page : `id`, `context`, `name`, `description`, `status`, `settings`, `last_triggered_at`, `published_at`, `created_at`, `updated_at`. Dans cette liste, `settings` est toujours un objet vide ; [récupérez l’automatisation](/fr/docs/api-reference/automations/get/) pour le lire.

- `total_records` (integer): Nombre d’automatisations correspondantes.

- `per_page` (integer): Taille de page utilisée.

- `current_page` (integer): Numéro de cette page.

- `total_pages` (integer): Nombre de pages.

**Requête** `GET /automations`

**cURL**

```bash
curl -G https://api.emailit.com/v2/automations \
  -H "Authorization: Bearer $EMAILIT_API_KEY" \
  --data-urlencode "filter[status]=running" \
  -d sort=last_triggered_at \
  -d per_page=50
```

**Node.js**

```javascript
const params = new URLSearchParams({ 'filter[status]': 'running', sort: 'last_triggered_at', per_page: '50' });
const res = await fetch(`https://api.emailit.com/v2/automations?${params}`, {
  headers: { Authorization: `Bearer ${process.env.EMAILIT_API_KEY}` },
});
const { data, total_pages } = await res.json();
```

**Python**

```python
import os, requests

r = requests.get(
    "https://api.emailit.com/v2/automations",
    headers={"Authorization": f"Bearer {os.environ['EMAILIT_API_KEY']}"},
    params={"filter[status]": "running", "sort": "last_triggered_at", "per_page": 50},
)
automations = r.json()["data"]
```

**PHP**

```php
$client = new GuzzleHttp\Client(['base_uri' => 'https://api.emailit.com/v2/']);

$response = $client->get('automations', [
    'headers' => ['Authorization' => 'Bearer ' . getenv('EMAILIT_API_KEY')],
    'query' => ['filter[status]' => 'running', 'sort' => 'last_triggered_at', 'per_page' => 50],
]);
$automations = json_decode($response->getBody(), true)['data'];
```

**200**

```json
{
  "data": [
    {
      "id": "aut_3xqC9YD79FZZA36uTekWTBO1ghe",
      "context": "contact",
      "name": "Welcome series",
      "description": "Welcome new subscribers, then nudge free users a day later.",
      "status": "running",
      "settings": {},
      "last_triggered_at": "2026-10-03T14:12:40.551870+00:00",
      "published_at": "2026-10-01T10:00:02.204118+00:00",
      "created_at": "2026-10-01T09:41:05.318274+00:00",
      "updated_at": "2026-10-03T14:12:40.551870+00:00"
    }
  ],
  "total_records": 1,
  "per_page": 50,
  "current_page": 1,
  "total_pages": 1
}
```

---
Source: https://emailit.com/fr/docs/api-reference/automations/list/

## Supprimer une automatisation — DELETE /automations/{id}

> Supprimez une automatisation pour qu’elle cesse de réagir aux déclencheurs. Arrêtez-la d’abord si vous voulez aussi annuler les exécutions en cours.

# Supprimer une automatisation

Supprime une automatisation. Elle disparaît des listes et cesse de réagir aux déclencheurs. Nécessite une clé API de portée `full`.

Les exécutions déjà en cours ne sont pas annulées. Pour les annuler, [arrêtez l’automatisation](/fr/docs/api-reference/automations/stop/) avant de la supprimer.

`DELETE /automations/{id}`

## Paramètres de chemin

- `id` (string, obligatoire): L’ID de l’automatisation (`aut_…`).

## Réponse

Renvoie un `message` qui confirme la suppression. Renvoie `404` si l’automatisation n’existe pas ou a déjà été supprimée.

**Requête** `DELETE /automations/{id}`

**cURL**

```bash
curl -X DELETE https://api.emailit.com/v2/automations/aut_3xqC9YD79FZZA36uTekWTBO1ghe \
  -H "Authorization: Bearer $EMAILIT_API_KEY"
```

**Node.js**

```javascript
const res = await fetch('https://api.emailit.com/v2/automations/aut_3xqC9YD79FZZA36uTekWTBO1ghe', {
  method: 'DELETE',
  headers: { Authorization: `Bearer ${process.env.EMAILIT_API_KEY}` },
});
const result = await res.json();
```

**Python**

```python
import os, requests

r = requests.delete(
    "https://api.emailit.com/v2/automations/aut_3xqC9YD79FZZA36uTekWTBO1ghe",
    headers={"Authorization": f"Bearer {os.environ['EMAILIT_API_KEY']}"},
)
result = r.json()
```

**PHP**

```php
$client = new GuzzleHttp\Client(['base_uri' => 'https://api.emailit.com/v2/']);

$response = $client->delete('automations/aut_3xqC9YD79FZZA36uTekWTBO1ghe', [
    'headers' => ['Authorization' => 'Bearer ' . getenv('EMAILIT_API_KEY')],
]);
$result = json_decode($response->getBody(), true);
```

**200**

```json
{
  "message": "Automation was deleted successfully.",
  "notify": true
}
```

**404**

```json
{
  "message": "Automation not found."
}
```

---
Source: https://emailit.com/fr/docs/api-reference/automations/delete/

## Démarrer une automatisation — POST /automations/{id}/start

> Passez une automatisation au statut running pour que ses déclencheurs démarrent de nouvelles exécutions. Fonctionne pour les automatisations en brouillon, en pause et arrêtées.

# Démarrer une automatisation

Fait passer le statut de l’automatisation à `running`. À partir de là, les déclencheurs correspondants démarrent des exécutions ; les événements survenus avant le démarrage n’en démarrent pas. Nécessite une clé API de portée `full`.

Vous pouvez démarrer une automatisation `draft`, `paused` ou `stopped`. Le premier démarrage définit `published_at`.

Le démarrage ne valide pas de nouveau le graphe. Si vous avez construit l’automatisation avec [Créer une automatisation](/fr/docs/api-reference/automations/create/), qui ne vérifie que la structure, assurez-vous que la configuration de chaque action est complète, ou envoyez une fois le graphe via [Mettre à jour une automatisation](/fr/docs/api-reference/automations/update/), qui le valide entièrement. Une étape dont la configuration est incomplète échoue lorsqu’une exécution l’atteint.

`POST /automations/{id}/start`

## Paramètres de chemin

- `id` (string, obligatoire): L’ID de l’automatisation (`aut_…`).

## Réponse

Renvoie l’automatisation dans `data` avec `status` défini sur `running`. Renvoie `404` si l’automatisation n’existe pas.

**Requête** `POST /automations/{id}/start`

**cURL**

```bash
curl -X POST https://api.emailit.com/v2/automations/aut_3xqC9YD79FZZA36uTekWTBO1ghe/start \
  -H "Authorization: Bearer $EMAILIT_API_KEY"
```

**Node.js**

```javascript
const res = await fetch('https://api.emailit.com/v2/automations/aut_3xqC9YD79FZZA36uTekWTBO1ghe/start', {
  method: 'POST',
  headers: { Authorization: `Bearer ${process.env.EMAILIT_API_KEY}` },
});
const { data: automation } = await res.json();
```

**Python**

```python
import os, requests

r = requests.post(
    "https://api.emailit.com/v2/automations/aut_3xqC9YD79FZZA36uTekWTBO1ghe/start",
    headers={"Authorization": f"Bearer {os.environ['EMAILIT_API_KEY']}"},
)
automation = r.json()["data"]
```

**PHP**

```php
$client = new GuzzleHttp\Client(['base_uri' => 'https://api.emailit.com/v2/']);

$response = $client->post('automations/aut_3xqC9YD79FZZA36uTekWTBO1ghe/start', [
    'headers' => ['Authorization' => 'Bearer ' . getenv('EMAILIT_API_KEY')],
]);
$automation = json_decode($response->getBody(), true)['data'];
```

**200**

```json
{
  "data": {
    "id": "aut_3xqC9YD79FZZA36uTekWTBO1ghe",
    "context": "contact",
    "name": "Welcome series",
    "description": "Welcome new subscribers, then nudge free users a day later.",
    "status": "running",
    "settings": { "allow_reentry": false },
    "last_triggered_at": null,
    "published_at": "2026-10-01T10:00:02.204118+00:00",
    "created_at": "2026-10-01T09:41:05.318274+00:00",
    "updated_at": "2026-10-01T10:00:02.204118+00:00",
    "steps": [
      {
        "id": "aus_3ZqpuxjmL1szZ8og6uGL1mT6QEJ",
        "key": "joined",
        "type": "trigger",
        "trigger": "contact.added_to_audience",
        "action": null,
        "config": { "audience_id": "aud_3Cz7WJ9GpvD7P0PQez50xOmkZSV" }
      },
      {
        "id": "aus_3V5TZIXXak1SSmGcOmzPOeFaguQ",
        "key": "welcome_email",
        "type": "action",
        "trigger": null,
        "action": "send_email",
        "config": { "type": "template", "template_id": "welcome", "from": "Acme <hello@acme.com>" }
      }
    ],
    "connections": [
      { "from": "joined", "to": "welcome_email", "branch": "default" }
    ]
  },
  "message": "Automation was successfully started.",
  "notify": true
}
```

**404**

```json
{
  "message": "Automation not found."
}
```

---
Source: https://emailit.com/fr/docs/api-reference/automations/start/

## Mettre en pause une automatisation — POST /automations/{id}/pause

> Mettez en pause une automatisation pour que ses déclencheurs cessent de démarrer de nouvelles exécutions, tandis que les exécutions déjà en cours vont jusqu’à leur terme.

# Mettre en pause une automatisation

Fait passer le statut de l’automatisation à `paused`. Ses déclencheurs cessent de démarrer de nouvelles exécutions, mais les exécutions déjà en cours continuent, y compris celles qui attendent sur une étape `wait`. Nécessite une clé API de portée `full`.

Pour annuler aussi les exécutions en cours, [arrêtez plutôt l’automatisation](/fr/docs/api-reference/automations/stop/). [Démarrez-la](/fr/docs/api-reference/automations/start/) de nouveau pour réactiver ses déclencheurs.

`POST /automations/{id}/pause`

## Paramètres de chemin

- `id` (string, obligatoire): L’ID de l’automatisation (`aut_…`).

## Réponse

Renvoie l’automatisation dans `data` avec `status` défini sur `paused`. Renvoie `404` si l’automatisation n’existe pas.

**Requête** `POST /automations/{id}/pause`

**cURL**

```bash
curl -X POST https://api.emailit.com/v2/automations/aut_3xqC9YD79FZZA36uTekWTBO1ghe/pause \
  -H "Authorization: Bearer $EMAILIT_API_KEY"
```

**Node.js**

```javascript
const res = await fetch('https://api.emailit.com/v2/automations/aut_3xqC9YD79FZZA36uTekWTBO1ghe/pause', {
  method: 'POST',
  headers: { Authorization: `Bearer ${process.env.EMAILIT_API_KEY}` },
});
const { data: automation } = await res.json();
```

**Python**

```python
import os, requests

r = requests.post(
    "https://api.emailit.com/v2/automations/aut_3xqC9YD79FZZA36uTekWTBO1ghe/pause",
    headers={"Authorization": f"Bearer {os.environ['EMAILIT_API_KEY']}"},
)
automation = r.json()["data"]
```

**PHP**

```php
$client = new GuzzleHttp\Client(['base_uri' => 'https://api.emailit.com/v2/']);

$response = $client->post('automations/aut_3xqC9YD79FZZA36uTekWTBO1ghe/pause', [
    'headers' => ['Authorization' => 'Bearer ' . getenv('EMAILIT_API_KEY')],
]);
$automation = json_decode($response->getBody(), true)['data'];
```

**200**

```json
{
  "data": {
    "id": "aut_3xqC9YD79FZZA36uTekWTBO1ghe",
    "context": "contact",
    "name": "Welcome series",
    "description": "Welcome new subscribers, then nudge free users a day later.",
    "status": "paused",
    "settings": { "allow_reentry": false },
    "last_triggered_at": "2026-10-03T14:12:40.551870+00:00",
    "published_at": "2026-10-01T10:00:02.204118+00:00",
    "created_at": "2026-10-01T09:41:05.318274+00:00",
    "updated_at": "2026-10-04T08:10:51.004732+00:00",
    "steps": [
      {
        "id": "aus_3ZqpuxjmL1szZ8og6uGL1mT6QEJ",
        "key": "joined",
        "type": "trigger",
        "trigger": "contact.added_to_audience",
        "action": null,
        "config": { "audience_id": "aud_3Cz7WJ9GpvD7P0PQez50xOmkZSV" }
      },
      {
        "id": "aus_3V5TZIXXak1SSmGcOmzPOeFaguQ",
        "key": "welcome_email",
        "type": "action",
        "trigger": null,
        "action": "send_email",
        "config": { "type": "template", "template_id": "welcome", "from": "Acme <hello@acme.com>" }
      }
    ],
    "connections": [
      { "from": "joined", "to": "welcome_email", "branch": "default" }
    ]
  },
  "message": "Automation was successfully paused.",
  "notify": true
}
```

**404**

```json
{
  "message": "Automation not found."
}
```

---
Source: https://emailit.com/fr/docs/api-reference/automations/pause/

## Arrêter une automatisation — POST /automations/{id}/stop

> Arrêtez une automatisation et annulez toutes ses exécutions en cours. Disponible uniquement via l’API, pas dans le tableau de bord.

# Arrêter une automatisation

Fait passer le statut de l’automatisation à `stopped` et annule chaque exécution encore `running` ; ces exécutions prennent le statut `canceled` et leurs étapes restantes ne sont pas exécutées. Nécessite une clé API de portée `full`.

L’arrêt n’est disponible que via l’API. Pour laisser les exécutions en cours se poursuivre, [mettez plutôt l’automatisation en pause](/fr/docs/api-reference/automations/pause/). Vous pouvez [démarrer](/fr/docs/api-reference/automations/start/) de nouveau une automatisation arrêtée ; les nouvelles exécutions repartent de zéro.

`POST /automations/{id}/stop`

## Paramètres de chemin

- `id` (string, obligatoire): L’ID de l’automatisation (`aut_…`).

## Réponse

Renvoie l’automatisation dans `data` avec `status` défini sur `stopped`. Renvoie `404` si l’automatisation n’existe pas.

**Requête** `POST /automations/{id}/stop`

**cURL**

```bash
curl -X POST https://api.emailit.com/v2/automations/aut_3xqC9YD79FZZA36uTekWTBO1ghe/stop \
  -H "Authorization: Bearer $EMAILIT_API_KEY"
```

**Node.js**

```javascript
const res = await fetch('https://api.emailit.com/v2/automations/aut_3xqC9YD79FZZA36uTekWTBO1ghe/stop', {
  method: 'POST',
  headers: { Authorization: `Bearer ${process.env.EMAILIT_API_KEY}` },
});
const { data: automation } = await res.json();
```

**Python**

```python
import os, requests

r = requests.post(
    "https://api.emailit.com/v2/automations/aut_3xqC9YD79FZZA36uTekWTBO1ghe/stop",
    headers={"Authorization": f"Bearer {os.environ['EMAILIT_API_KEY']}"},
)
automation = r.json()["data"]
```

**PHP**

```php
$client = new GuzzleHttp\Client(['base_uri' => 'https://api.emailit.com/v2/']);

$response = $client->post('automations/aut_3xqC9YD79FZZA36uTekWTBO1ghe/stop', [
    'headers' => ['Authorization' => 'Bearer ' . getenv('EMAILIT_API_KEY')],
]);
$automation = json_decode($response->getBody(), true)['data'];
```

**200**

```json
{
  "data": {
    "id": "aut_3xqC9YD79FZZA36uTekWTBO1ghe",
    "context": "contact",
    "name": "Welcome series",
    "description": "Welcome new subscribers, then nudge free users a day later.",
    "status": "stopped",
    "settings": { "allow_reentry": false },
    "last_triggered_at": "2026-10-03T14:12:40.551870+00:00",
    "published_at": "2026-10-01T10:00:02.204118+00:00",
    "created_at": "2026-10-01T09:41:05.318274+00:00",
    "updated_at": "2026-10-05T16:45:09.882301+00:00",
    "steps": [
      {
        "id": "aus_3ZqpuxjmL1szZ8og6uGL1mT6QEJ",
        "key": "joined",
        "type": "trigger",
        "trigger": "contact.added_to_audience",
        "action": null,
        "config": { "audience_id": "aud_3Cz7WJ9GpvD7P0PQez50xOmkZSV" }
      },
      {
        "id": "aus_3V5TZIXXak1SSmGcOmzPOeFaguQ",
        "key": "welcome_email",
        "type": "action",
        "trigger": null,
        "action": "send_email",
        "config": { "type": "template", "template_id": "welcome", "from": "Acme <hello@acme.com>" }
      }
    ],
    "connections": [
      { "from": "joined", "to": "welcome_email", "branch": "default" }
    ]
  },
  "message": "Automation was successfully stopped.",
  "notify": true
}
```

**404**

```json
{
  "message": "Automation not found."
}
```

---
Source: https://emailit.com/fr/docs/api-reference/automations/stop/

## Déclencher une exécution — POST /automations/{id}/trigger

> Activez le déclencheur system.manual d’une automatisation active avec votre propre payload pour démarrer une exécution depuis votre code.

# Déclencher une exécution

Active le déclencheur `system.manual` avec le payload de votre choix. L’automatisation doit être `running` et comporter une étape de déclenchement `system.manual` ; sinon, aucune exécution ne démarre. Nécessite une clé API de portée `full`. Les déclenchements manuels ne sont disponibles que via l’API.

L’exécution démarre de manière asynchrone et coûte 3 crédits, comme toute autre exécution. Retrouvez-la avec [Lister les exécutions](/fr/docs/api-reference/automations/runs/).

> **Tous les déclencheurs manuels de l’espace de travail s’activent:** Pour le moment, Emailit transmet le déclenchement manuel à toutes les automatisations actives de l’espace de travail qui ont une étape de déclenchement `system.manual`, et pas seulement à celle indiquée dans le chemin. Pour limiter une automatisation à ses propres appels, ajoutez un filtre à son étape de déclenchement : `{ "match": "all", "rules": [{ "field": "automation_id", "operator": "equals", "value": "aut_…" }] }`.

`POST /automations/{id}/trigger`

## Paramètres de chemin

- `id` (string, obligatoire): L’ID de l’automatisation (`aut_…`).

## Paramètres du corps

- `payload` (object): Les données de l’exécution. Emailit y ajoute `automation_id` et enregistre le résultat comme `payload` de l’exécution. Les étapes peuvent le lire avec des variables comme `{{payload.order_id}}` et des conditions comme `payload.plan`. Ce sur quoi porte l’exécution dépend du contexte de l’automatisation : - `contact` : transmettez `contact_id` (`con_…`). Les actions sur les contacts et `send_email` utilisent ce contact. - `email` : transmettez `email_id` (`em_…`). Les actions sur les e-mails utilisent cet e-mail. - `event` : n’importe quelles données. Définissez `to` ou `email` dans la configuration des actions, par exemple `"to": "{{payload.customer_email}}"`.

## Réponse

Renvoie `200` avec un `message` une fois le déclenchement mis en file d’attente. Renvoie `422` si l’automatisation n’est pas `running`, et `404` si elle n’existe pas.

**Requête** `POST /automations/{id}/trigger`

**cURL**

```bash
curl -X POST https://api.emailit.com/v2/automations/aut_3xqC9YD79FZZA36uTekWTBO1ghe/trigger \
  -H "Authorization: Bearer $EMAILIT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "payload": {
      "contact_id": "con_3munwNLaXKUARc6ff9wPtxKVq4A",
      "plan": "pro",
      "order_id": "ord_1042"
    }
  }'
```

**Node.js**

```javascript
const res = await fetch('https://api.emailit.com/v2/automations/aut_3xqC9YD79FZZA36uTekWTBO1ghe/trigger', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.EMAILIT_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    payload: { contact_id: 'con_3munwNLaXKUARc6ff9wPtxKVq4A', plan: 'pro', order_id: 'ord_1042' },
  }),
});
const result = await res.json();
```

**Python**

```python
import os, requests

r = requests.post(
    "https://api.emailit.com/v2/automations/aut_3xqC9YD79FZZA36uTekWTBO1ghe/trigger",
    headers={"Authorization": f"Bearer {os.environ['EMAILIT_API_KEY']}"},
    json={"payload": {"contact_id": "con_3munwNLaXKUARc6ff9wPtxKVq4A", "plan": "pro", "order_id": "ord_1042"}},
)
result = r.json()
```

**PHP**

```php
$client = new GuzzleHttp\Client(['base_uri' => 'https://api.emailit.com/v2/']);

$response = $client->post('automations/aut_3xqC9YD79FZZA36uTekWTBO1ghe/trigger', [
    'headers' => ['Authorization' => 'Bearer ' . getenv('EMAILIT_API_KEY')],
    'json' => [
        'payload' => ['contact_id' => 'con_3munwNLaXKUARc6ff9wPtxKVq4A', 'plan' => 'pro', 'order_id' => 'ord_1042'],
    ],
]);
$result = json_decode($response->getBody(), true);
```

**200**

```json
{
  "message": "Automation trigger dispatched."
}
```

**422**

```json
{
  "message": "Automation must be running to trigger."
}
```

**404**

```json
{
  "message": "Automation not found."
}
```

---
Source: https://emailit.com/fr/docs/api-reference/automations/trigger/

## Lister les exécutions — GET /automations/{id}/runs

> Listez les exécutions d’une automatisation, de la plus récente à la plus ancienne, avec l’événement déclencheur, le payload, le statut et les horodatages de chaque exécution.

# Lister les exécutions

Renvoie les exécutions d’une automatisation, de la plus récente à la plus ancienne. Chaque exécution est un parcours du graphe, démarré par un déclencheur. Nécessite une clé API de portée `full`.

`GET /automations/{id}/runs`

## Paramètres de chemin

- `id` (string, obligatoire): L’ID de l’automatisation (`aut_…`).

## Paramètres de requête

- `page` (integer): Numéro de page, à partir de 1.

- `per_page` (integer): Nombre d’exécutions par page, de 1 à 100.

- `filter[status]` (string): Uniquement les exécutions de ce statut : `running`, `completed`, `failed` ou `canceled`.

Vous pouvez aussi filtrer avec `key.condition=value` sur `status`, `event` et `created_at` (par exemple `created_at.after=2026-10-01`), et trier avec `order` et `direction` sur les mêmes clés. Consultez [Filtrage et tri](/fr/docs/api-reference/filtering/).

## Réponse

- `data` (object[]): Les exécutions de cette page. Leurs champs sont détaillés ci-dessous.

- `total_records, per_page, current_page, total_pages` (integer): Informations de pagination.

Chaque exécution comporte :

- `id` (string): ID de l’exécution, avec le préfixe `aur_`.

- `automation_id` (string): L’automatisation (`aut_…`).

- `contact_id` (string | null): Le contact de l’exécution (`con_…`) dans le contexte `contact`.

- `email_id` (string | null): L’e-mail de l’exécution (`em_…`) dans le contexte `email`.

- `event_id` (string | null): ID de l’événement source, lorsque le payload du déclencheur en contient un.

- `event` (string): Le déclencheur qui a démarré l’exécution, par exemple `contact.added_to_audience` ou `system.manual`.

- `payload` (object): Toujours un objet vide dans cette liste. [Récupérez l’exécution](/fr/docs/api-reference/automations/run/) pour lire le payload de son déclencheur.

- `meta` (object): Toujours un objet vide dans cette liste. Récupérez l’exécution pour lire ses métadonnées, comme `failure_reason`.

- `status` (string): `running`, `completed`, `failed` ou `canceled` (l’automatisation a été arrêtée).

- `started_at, completed_at, created_at, updated_at` (string | null): Horodatages en UTC.

**Requête** `GET /automations/{id}/runs`

**cURL**

```bash
curl -G https://api.emailit.com/v2/automations/aut_3xqC9YD79FZZA36uTekWTBO1ghe/runs \
  -H "Authorization: Bearer $EMAILIT_API_KEY" \
  --data-urlencode "filter[status]=failed"
```

**Node.js**

```javascript
const params = new URLSearchParams({ 'filter[status]': 'failed' });
const res = await fetch(
  `https://api.emailit.com/v2/automations/aut_3xqC9YD79FZZA36uTekWTBO1ghe/runs?${params}`,
  { headers: { Authorization: `Bearer ${process.env.EMAILIT_API_KEY}` } },
);
const { data: runs } = await res.json();
```

**Python**

```python
import os, requests

r = requests.get(
    "https://api.emailit.com/v2/automations/aut_3xqC9YD79FZZA36uTekWTBO1ghe/runs",
    headers={"Authorization": f"Bearer {os.environ['EMAILIT_API_KEY']}"},
    params={"filter[status]": "failed"},
)
runs = r.json()["data"]
```

**PHP**

```php
$client = new GuzzleHttp\Client(['base_uri' => 'https://api.emailit.com/v2/']);

$response = $client->get('automations/aut_3xqC9YD79FZZA36uTekWTBO1ghe/runs', [
    'headers' => ['Authorization' => 'Bearer ' . getenv('EMAILIT_API_KEY')],
    'query' => ['filter[status]' => 'failed'],
]);
$runs = json_decode($response->getBody(), true)['data'];
```

**200**

```json
{
  "data": [
    {
      "id": "aur_3q6GdFk2eRSG093grI0v9e6REu8",
      "automation_id": "aut_3xqC9YD79FZZA36uTekWTBO1ghe",
      "contact_id": "con_3munwNLaXKUARc6ff9wPtxKVq4A",
      "email_id": null,
      "event_id": null,
      "event": "contact.added_to_audience",
      "payload": {},
      "meta": {},
      "status": "failed",
      "started_at": "2026-10-03T14:12:40.551870+00:00",
      "completed_at": "2026-10-03T14:12:41.093355+00:00",
      "created_at": "2026-10-03T14:12:40.551870+00:00",
      "updated_at": "2026-10-03T14:12:41.093355+00:00"
    }
  ],
  "total_records": 1,
  "per_page": 25,
  "current_page": 1,
  "total_pages": 1
}
```

**404**

```json
{
  "message": "Automation not found."
}
```

---
Source: https://emailit.com/fr/docs/api-reference/automations/runs/

## Récupérer une exécution — GET /automations/{id}/runs/{run_id}

> Récupérez une exécution d’automatisation avec le payload de son déclencheur, ses métadonnées, ainsi que le statut et le résultat de chaque étape exécutée.

# Récupérer une exécution

Récupère une exécution d’une automatisation, y compris les étapes qu’elle a exécutées. Nécessite une clé API de portée `full`.

`GET /automations/{id}/runs/{run_id}`

## Paramètres de chemin

- `id` (string, obligatoire): L’ID de l’automatisation (`aut_…`).

- `run_id` (string, obligatoire): L’ID de l’exécution (`aur_…`).

## Réponse

Renvoie l’exécution dans `data` avec les champs décrits dans [Lister les exécutions](/fr/docs/api-reference/automations/runs/), ainsi que les `payload` et `meta` complets et un tableau `run_steps`.

- `payload` (object | null): Le payload du déclencheur : les données de l’événement (`{ "object": { … } }`) ou le payload que vous avez transmis à [Déclencher une exécution](/fr/docs/api-reference/automations/trigger/), complété par `automation_id`.

- `meta` (object | null): `source_event_id` relie l’exécution à l’événement qui l’a démarrée. Les exécutions en échec peuvent avoir un `failure_reason` : `insufficient_credits` (les 3 crédits de l’exécution n’ont pas pu être débités) ou `run_timeout` (l’exécution était toujours `running` au bout de 72 heures sans étape en attente).

- `run_steps` (object[]): Une entrée par étape atteinte par l’exécution : - `step_id` : l’ID de l’étape (`aus_…`). Faites-le correspondre à `steps[].id` renvoyé par [Récupérer une automatisation](/fr/docs/api-reference/automations/get/). - `status` : `running`, `waiting` (une étape `wait` dont le délai n’est pas écoulé), `completed` ou `failed`. - `data` : le résultat de l’étape. Par exemple, `send_email` renvoie `{ "result": "email_queued", "email_oid": "em_…", "to": "…" }`, `condition` renvoie `{ "result": true, "branch": "yes" }`, et les étapes en échec renvoient `{ "error": "…" }`. - `started_at`, `completed_at`, `created_at`.

Renvoie `404` si l’automatisation ou l’exécution n’existe pas.

**Requête** `GET /automations/{id}/runs/{run_id}`

**cURL**

```bash
curl https://api.emailit.com/v2/automations/aut_3xqC9YD79FZZA36uTekWTBO1ghe/runs/aur_3q6GdFk2eRSG093grI0v9e6REu8 \
  -H "Authorization: Bearer $EMAILIT_API_KEY"
```

**Node.js**

```javascript
const res = await fetch(
  'https://api.emailit.com/v2/automations/aut_3xqC9YD79FZZA36uTekWTBO1ghe/runs/aur_3q6GdFk2eRSG093grI0v9e6REu8',
  { headers: { Authorization: `Bearer ${process.env.EMAILIT_API_KEY}` } },
);
const { data: run } = await res.json();
```

**Python**

```python
import os, requests

r = requests.get(
    "https://api.emailit.com/v2/automations/aut_3xqC9YD79FZZA36uTekWTBO1ghe/runs/aur_3q6GdFk2eRSG093grI0v9e6REu8",
    headers={"Authorization": f"Bearer {os.environ['EMAILIT_API_KEY']}"},
)
run = r.json()["data"]
```

**PHP**

```php
$client = new GuzzleHttp\Client(['base_uri' => 'https://api.emailit.com/v2/']);

$response = $client->get('automations/aut_3xqC9YD79FZZA36uTekWTBO1ghe/runs/aur_3q6GdFk2eRSG093grI0v9e6REu8', [
    'headers' => ['Authorization' => 'Bearer ' . getenv('EMAILIT_API_KEY')],
]);
$run = json_decode($response->getBody(), true)['data'];
```

**200**

```json
{
  "data": {
    "id": "aur_3q6GdFk2eRSG093grI0v9e6REu8",
    "automation_id": "aut_3xqC9YD79FZZA36uTekWTBO1ghe",
    "contact_id": "con_3munwNLaXKUARc6ff9wPtxKVq4A",
    "email_id": null,
    "event_id": null,
    "event": "contact.added_to_audience",
    "payload": {
      "object": {
        "id": "sub_3Fh2pQx9LmZr4Wt7Nc0bVd8KsYe",
        "object": "subscriber",
        "subscribed": true,
        "audience": { "id": "aud_3Cz7WJ9GpvD7P0PQez50xOmkZSV", "name": "Newsletter" },
        "contact": { "id": "con_3munwNLaXKUARc6ff9wPtxKVq4A", "email": "ada@example.com" }
      }
    },
    "meta": { "source_event_id": "evt_3Kd8sWq1NzXc5Vb7Mt2LpRy0HgA" },
    "status": "running",
    "started_at": "2026-10-03T14:12:40.551870+00:00",
    "completed_at": null,
    "created_at": "2026-10-03T14:12:40.551870+00:00",
    "updated_at": "2026-10-03T14:12:40.551870+00:00",
    "run_steps": [
      {
        "step_id": "aus_3V5TZIXXak1SSmGcOmzPOeFaguQ",
        "status": "completed",
        "data": {
          "result": "email_queued",
          "outcome": "accepted",
          "email_oid": "em_3Cp8cMgPskzB8tIlgUyNJkpDp9O",
          "to": "ada@example.com"
        },
        "started_at": "2026-10-03T14:12:40.702113+00:00",
        "completed_at": "2026-10-03T14:12:40.918540+00:00",
        "created_at": "2026-10-03T14:12:40.702113+00:00"
      },
      {
        "step_id": "aus_3vM0ORwEXCQcyS7rylfQBQEXjVk",
        "status": "waiting",
        "data": { "status": "waiting", "delayMs": 86400000, "seconds": 86400 },
        "started_at": "2026-10-03T14:12:41.004221+00:00",
        "completed_at": null,
        "created_at": "2026-10-03T14:12:41.004221+00:00"
      }
    ]
  }
}
```

**404**

```json
{
  "message": "Run not found."
}
```

---
Source: https://emailit.com/fr/docs/api-reference/automations/run/

## Récupérer les statistiques — GET /automations/{id}/stats

> Obtenez les décomptes par étape d’une automatisation : nombre d’exécutions ayant atteint chaque étape, statuts des étapes, issues et entonnoir des e-mails.

# Récupérer les statistiques

Renvoie des décomptes pour chaque étape d’une automatisation, indexés par clé d’étape. Nécessite une clé API de portée `full`.

`GET /automations/{id}/stats`

## Paramètres de chemin

- `id` (string, obligatoire): L’ID de l’automatisation (`aut_…`).

## Paramètres de requête

- `since` (string): Ne compte que les exécutions d’étapes créées à cette date ou après. Date-heure RFC 3339, par exemple `2026-10-01T00:00:00Z`.

- `until` (string): Ne compte que les exécutions d’étapes créées à cette date ou avant. Date-heure RFC 3339.

- `run_ids[]` (string): Ne compte que ces exécutions (`aur_…`). Répétez le paramètre pour plusieurs exécutions.

## Réponse

Renvoie `data`, un objet qui contient une entrée par clé d’étape. Les étapes qu’aucune exécution n’a atteintes ont un `total` de `0`.

- `total` (integer): Nombre de fois où des exécutions ont atteint l’étape.

- `by_status` (object): Décomptes par statut d’étape : `running`, `waiting`, `completed`, `failed`.

- `by_outcome` (object): Décomptes par issue. `send_email` et `forward_email` : `accepted`, puis le dernier état de l’e-mail (`delivered`, `loaded`, `clicked`, `bounced`, `failed`, `complained`, `unsubscribed`, `canceled`). `condition` : `matched`, `not_matched`. `experiment` : la clé de la variante choisie. `call_webhook` : `2xx`, `4xx`, `5xx`, `timeout`, `network_error`. Étapes en échec : `error`.

- `funnel` (object): Uniquement pour les étapes `send_email`. Décomptes cumulés : `accepted` inclut tous les e-mails qui sont allés plus loin, `delivered` inclut les e-mails chargés et cliqués, et `loaded` inclut les e-mails cliqués. `bounced`, `failed`, `complained` et `unsubscribed` sont des décomptes simples.

**Requête** `GET /automations/{id}/stats`

**cURL**

```bash
curl -G https://api.emailit.com/v2/automations/aut_3xqC9YD79FZZA36uTekWTBO1ghe/stats \
  -H "Authorization: Bearer $EMAILIT_API_KEY" \
  -d since=2026-10-01T00:00:00Z
```

**Node.js**

```javascript
const params = new URLSearchParams({ since: '2026-10-01T00:00:00Z' });
const res = await fetch(
  `https://api.emailit.com/v2/automations/aut_3xqC9YD79FZZA36uTekWTBO1ghe/stats?${params}`,
  { headers: { Authorization: `Bearer ${process.env.EMAILIT_API_KEY}` } },
);
const { data: stats } = await res.json();
```

**Python**

```python
import os, requests

r = requests.get(
    "https://api.emailit.com/v2/automations/aut_3xqC9YD79FZZA36uTekWTBO1ghe/stats",
    headers={"Authorization": f"Bearer {os.environ['EMAILIT_API_KEY']}"},
    params={"since": "2026-10-01T00:00:00Z"},
)
stats = r.json()["data"]
```

**PHP**

```php
$client = new GuzzleHttp\Client(['base_uri' => 'https://api.emailit.com/v2/']);

$response = $client->get('automations/aut_3xqC9YD79FZZA36uTekWTBO1ghe/stats', [
    'headers' => ['Authorization' => 'Bearer ' . getenv('EMAILIT_API_KEY')],
    'query' => ['since' => '2026-10-01T00:00:00Z'],
]);
$stats = json_decode($response->getBody(), true)['data'];
```

**200**

```json
{
  "data": {
    "joined": { "total": 0, "by_status": {}, "by_outcome": {} },
    "welcome_email": {
      "total": 412,
      "by_status": { "completed": 409, "failed": 3 },
      "by_outcome": { "delivered": 251, "loaded": 98, "clicked": 41, "bounced": 19, "error": 3 },
      "funnel": {
        "accepted": 390,
        "delivered": 390,
        "loaded": 139,
        "clicked": 41,
        "bounced": 19,
        "failed": 0,
        "complained": 0,
        "unsubscribed": 0
      }
    },
    "wait_1_day": {
      "total": 409,
      "by_status": { "completed": 352, "waiting": 57 },
      "by_outcome": {}
    },
    "is_free_user": {
      "total": 352,
      "by_status": { "completed": 352 },
      "by_outcome": { "matched": 270, "not_matched": 82 }
    },
    "upgrade_tips": {
      "total": 270,
      "by_status": { "completed": 270 },
      "by_outcome": { "accepted": 12, "delivered": 180, "loaded": 61, "clicked": 17 },
      "funnel": {
        "accepted": 270,
        "delivered": 258,
        "loaded": 78,
        "clicked": 17,
        "bounced": 0,
        "failed": 0,
        "complained": 0,
        "unsubscribed": 0
      }
    },
    "done": {
      "total": 82,
      "by_status": { "completed": 82 },
      "by_outcome": {}
    }
  }
}
```

**404**

```json
{
  "message": "Automation not found."
}
```

---
Source: https://emailit.com/fr/docs/api-reference/automations/stats/

## Récupérer les statistiques d’une étape — GET /automations/{id}/steps/{step_key}/stats

> Obtenez les décomptes d’une seule étape d’automatisation à partir de sa clé : exécutions, statuts, issues et entonnoir des e-mails.

# Récupérer les statistiques d’une étape

Renvoie les décomptes d’une étape d’une automatisation. Nécessite une clé API de portée `full`. Les champs sont les mêmes que dans [Récupérer les statistiques](/fr/docs/api-reference/automations/stats/).

`GET /automations/{id}/steps/{step_key}/stats`

## Paramètres de chemin

- `id` (string, obligatoire): L’ID de l’automatisation (`aut_…`).

- `step_key` (string, obligatoire): La `key` de l’étape, par exemple `welcome_email`.

## Paramètres de requête

- `since` (string): Ne compte que les exécutions d’étapes créées à cette date ou après. Date-heure RFC 3339.

- `until` (string): Ne compte que les exécutions d’étapes créées à cette date ou avant. Date-heure RFC 3339.

## Réponse

Renvoie `data` avec `total`, `by_status`, `by_outcome` et, pour les étapes `send_email`, `funnel`. Renvoie `404` si l’automatisation ou la clé d’étape n’existe pas.

**Requête** `GET /automations/{id}/steps/{step_key}/stats`

**cURL**

```bash
curl https://api.emailit.com/v2/automations/aut_3xqC9YD79FZZA36uTekWTBO1ghe/steps/welcome_email/stats \
  -H "Authorization: Bearer $EMAILIT_API_KEY"
```

**Node.js**

```javascript
const res = await fetch(
  'https://api.emailit.com/v2/automations/aut_3xqC9YD79FZZA36uTekWTBO1ghe/steps/welcome_email/stats',
  { headers: { Authorization: `Bearer ${process.env.EMAILIT_API_KEY}` } },
);
const { data: stats } = await res.json();
```

**Python**

```python
import os, requests

r = requests.get(
    "https://api.emailit.com/v2/automations/aut_3xqC9YD79FZZA36uTekWTBO1ghe/steps/welcome_email/stats",
    headers={"Authorization": f"Bearer {os.environ['EMAILIT_API_KEY']}"},
)
stats = r.json()["data"]
```

**PHP**

```php
$client = new GuzzleHttp\Client(['base_uri' => 'https://api.emailit.com/v2/']);

$response = $client->get('automations/aut_3xqC9YD79FZZA36uTekWTBO1ghe/steps/welcome_email/stats', [
    'headers' => ['Authorization' => 'Bearer ' . getenv('EMAILIT_API_KEY')],
]);
$stats = json_decode($response->getBody(), true)['data'];
```

**200**

```json
{
  "data": {
    "total": 412,
    "by_status": { "completed": 409, "failed": 3 },
    "by_outcome": { "delivered": 251, "loaded": 98, "clicked": 41, "bounced": 19, "error": 3 },
    "funnel": {
      "accepted": 390,
      "delivered": 390,
      "loaded": 139,
      "clicked": 41,
      "bounced": 19,
      "failed": 0,
      "complained": 0,
      "unsubscribed": 0
    }
  }
}
```

**404**

```json
{
  "message": "Step not found."
}
```

---
Source: https://emailit.com/fr/docs/api-reference/automations/step-stats/
