# Référence de l'API VaEmail

Générée depuis la spécification OpenAPI, elle-même dérivée des routes réellement servies.
Ne pas éditer à la main : `php artisan docs:generer`.

Spécification complète : https://app.vaemail.fr/openapi.json
Capacités du service : https://app.vaemail.fr/api/v1/capabilities

## Authentification

Toutes les routes, sauf `/api/v1/capabilities`, attendent la clé du compte en en-tête :

```
api-key: swm_votre_cle
```

`X-Api-Key` est accepté aussi, par compatibilité.

## Portées

Une clé peut être restreinte à certaines portées. Une clé qui n'en déclare aucune les a toutes.

| Portée | Ce qu'elle autorise |
| --- | --- |
| `email.send` | Envoyer des emails (transactionnel et campagnes). |
| `email.read_status` | Lire le statut de livraison des messages. |
| `domain.read` | Lire les domaines et leur authentification. |
| `domain.write` | Déclarer et vérifier un domaine. |
| `contacts.read` | Lire les contacts et les listes. |
| `contacts.write` | Créer et modifier les contacts et les listes. |
| `analytics.read` | Lire les statistiques et la délivrabilité. |
| `billing.read` | Lire la consommation et les quotas. |

## Découverte

Ce que le service sait faire, sans authentification.

### `GET /api/v1/capabilities`

Ce que le service sait faire

Premier appel utile : décrit le produit, ses interfaces, ses limites et ses portées, sans clé d'API. Sert à décider si VaEmail couvre un besoin avant même d'ouvrir un compte.

### `GET /api/v1/health`

État du service

Base de données, file d'attente et transporteur. Répond 503 si la base est injoignable.

## Transactionnel

Envoi unitaire déclenché par une application ou un agent.

### `POST /api/v1/transactional/send`

Envoyer un email

Met un message en file et répond immédiatement 202 avec son identifiant : la réponse dit que le message est ACCEPTÉ, pas qu'il est arrivé. Pour la remise, interroger GET /api/v1/messages/{id}.

Portée de clé nécessaire : `email.send`.
Accepte l'en-tête `Idempotency-Key` : une relance rejoue la réponse au lieu de refaire l'action.
Débit : 60 requêtes par minute.

### `POST /v3/smtp/email`

Envoyer un email (schéma Brevo)

Même schéma que `POST https://api.brevo.com/v3/smtp/email`. Pour un nouveau développement, préférer `/api/v1/transactional/send`, qui rend des erreurs structurées.

Débit : 300 requêtes par minute.

### `GET /v3/smtp/templates`

Lister les templates transactionnels

Lister les templates transactionnels

## Messages

Suivi de livraison et vérification avant envoi.

### `GET /api/v1/messages`

Lister les messages

Du plus récent au plus ancien. Pagination par curseur : rappeler l'endpoint avec `cursor` = `next_cursor`.

Portée de clé nécessaire : `email.read_status`.

Paramètres :

- `status` : Filtre : queued, sent, delivered, failed, suppressed, held, cancelled.
- `tag` : Filtre sur l'étiquette posée à l'envoi.
- `to` : Filtre sur le destinataire.
- `limit` : Nombre de lignes, 1 à 200 (50 par défaut).
- `cursor` : Curseur de pagination renvoyé par un appel précédent.

### `POST /api/v1/messages/validate`

Essai à blanc d'un envoi

Dit si l'envoi passerait et nomme ce qui le bloquerait, SANS rien envoyer. À utiliser après une configuration, avant le premier vrai message.

Portée de clé nécessaire : `email.send`.

### `GET /api/v1/messages/{id}`

Statut d'un message

Statut de remise et suite des événements connus (remise, ouverture, clic, rebond, plainte).

Portée de clé nécessaire : `email.read_status`.

## Campagnes

Envoi en masse à une liste, et son cycle de vie.

### `POST /api/v1/automations/abandoned-cart`

Déclencher le scénario « panier abandonné »

Déclencher le scénario « panier abandonné »

Portée de clé nécessaire : `email.send`.

### `POST /api/v1/campaigns/conversion`

Déclarer une conversion

Rattache un achat ou une inscription à la campagne qui l'a précédé.

### `POST /api/v1/campaigns/preview`

Prévisualiser une campagne

Rend le HTML final d'une campagne, variables fusionnées, sans l'envoyer.

Portée de clé nécessaire : `email.send`.

### `POST /api/v1/campaigns/send`

Envoyer une campagne

Déclenche l'envoi à toute une liste.

Portée de clé nécessaire : `email.send`.
Accepte l'en-tête `Idempotency-Key` : une relance rejoue la réponse au lieu de refaire l'action.
Débit : 10 requêtes par minute.

### `GET /api/v1/campaigns/{id}/stats`

Statistiques d'une campagne

Statistiques d'une campagne

Portée de clé nécessaire : `analytics.read`.

### `GET /v3/emailCampaigns`

Lister les campagnes

Lister les campagnes

### `POST /v3/emailCampaigns`

Créer une campagne

Créer une campagne

### `GET /v3/emailCampaigns/{id}`

Lire une campagne

Lire une campagne

### `PUT /v3/emailCampaigns/{id}`

Modifier une campagne

Modifier une campagne

### `DELETE /v3/emailCampaigns/{id}`

Supprimer une campagne

Supprimer une campagne

### `POST /v3/emailCampaigns/{id}/cancel`

Annuler un envoi

Annuler un envoi

⚠ Action irréversible : à ne pas lancer sans validation humaine explicite.

> Action irréversible. À ne pas déclencher sans validation humaine explicite.

### `POST /v3/emailCampaigns/{id}/pause`

Interrompre un envoi en cours

Interrompre un envoi en cours

### `POST /v3/emailCampaigns/{id}/resume`

Reprendre un envoi interrompu

Reprendre un envoi interrompu

### `POST /v3/emailCampaigns/{id}/schedule`

Programmer un envoi

Programmer un envoi

### `POST /v3/emailCampaigns/{id}/sendNow`

Envoyer maintenant

ACTION DESTRUCTIVE ET IRRÉVERSIBLE : les emails partent immédiatement à toute la liste. Exige une confirmation explicite dans le corps de la requête. Un appel sans corps a expédié 2 982 emails un samedi soir le 05/09/2026 ; la confirmation existe depuis.

⚠ Action irréversible : à ne pas lancer sans validation humaine explicite.
Débit : 10 requêtes par minute.

> Action irréversible. À ne pas déclencher sans validation humaine explicite.

### `POST /v3/emailCampaigns/{id}/sendTest`

Envoyer un test

À faire avant tout envoi réel.

Débit : 20 requêtes par minute.

### `GET /v3/emailCampaigns/{id}/statistics`

Statistiques d'une campagne

Statistiques d'une campagne

### `PUT /v3/emailCampaigns/{id}/status`

Changer le statut d'une campagne

Changer le statut d'une campagne

### `POST /v3/emailCampaigns/{id}/stop`

Interrompre un envoi en cours (synonyme de pause)

Interrompre un envoi en cours (synonyme de pause)

## Contacts

Contacts, listes et attributs personnalisés.

### `GET /v3/contacts`

Lister les contacts

Lister les contacts

### `POST /v3/contacts`

Créer ou mettre à jour un contact

Créer ou mettre à jour un contact

### `GET /v3/contacts/attributes`

Lister les attributs personnalisés

Lister les attributs personnalisés

### `POST /v3/contacts/attributes/{category}/{name}`

Créer un attribut

Créer un attribut

### `PUT /v3/contacts/attributes/{category}/{name}`

Modifier un attribut

Modifier un attribut

### `DELETE /v3/contacts/attributes/{category}/{name}`

Supprimer un attribut

Supprimer un attribut

### `POST /v3/contacts/import`

Importer des contacts en lot

Importer des contacts en lot

### `GET /v3/contacts/lists`

Lister les listes

Lister les listes

### `POST /v3/contacts/lists`

Créer une liste

Créer une liste

### `GET /v3/contacts/lists/{id}`

Lire une liste

Lire une liste

### `PUT /v3/contacts/lists/{id}`

Renommer une liste

Renommer une liste

### `DELETE /v3/contacts/lists/{id}`

Supprimer une liste

Supprimer une liste

### `GET /v3/contacts/{identifier}`

Lire un contact

L'identifiant est l'adresse email ou l'identifiant numérique.

### `PUT /v3/contacts/{identifier}`

Modifier un contact

Modifier un contact

### `DELETE /v3/contacts/{identifier}`

Supprimer un contact

Supprimer un contact

## Domaines

Authentification des domaines d'envoi (SPF, DKIM, DMARC).

### `GET /api/v1/domains`

Lister les domaines d'envoi

Chaque domaine déclaré, avec l'état réel de son SPF, DKIM et DMARC lu dans le DNS public.

Portée de clé nécessaire : `domain.read`.

### `POST /api/v1/domains`

Déclarer un domaine d'envoi

Deuxième étape d'une installation autonome, juste après la clé. Rend les enregistrements DNS à poser et l'état courant de l'authentification : sans SPF ni DMARC, tout ce qui part est classé en indésirable.

Portée de clé nécessaire : `domain.write`.
Accepte l'en-tête `Idempotency-Key` : une relance rejoue la réponse au lieu de refaire l'action.

### `POST /api/v1/domains/verify`

Vérifier l'authentification d'un domaine

Lit SPF, DKIM et DMARC dans le DNS public et rend le verdict enregistrement par enregistrement. Sans SPF et DMARC, les grands fournisseurs classent l'envoi en indésirable.

Portée de clé nécessaire : `domain.write`.

### `GET /api/v1/domains/{domain}/dns`

Enregistrements DNS attendus pour un domaine

Ce qu'il faut poser chez le registrar, enregistrement par enregistrement, avec le rôle de chacun.

Portée de clé nécessaire : `domain.read`.

## Délivrabilité

Diagnostic, réputation et statistiques de remise.

### `GET /api/v1/deliverability/diagnose`

Diagnostiquer la délivrabilité

Répond à « pourquoi mes emails partent mal ? » : authentification de chaque domaine, constats de réputation (rebonds durs, plaintes, provenance des contacts) et actions recommandées, chacune avec l'endpoint qui la réalise.

Portée de clé nécessaire : `analytics.read`.

Paramètres :

- `domain` : Restreint le diagnostic à un domaine déclaré.

### `GET /api/v1/stats/cohorts`

Cohortes d'envoi par mois

Cohortes d'envoi par mois

Portée de clé nécessaire : `analytics.read`.

### `GET /api/v1/stats/deliverability`

Statistiques de remise par domaine destinataire

Statistiques de remise par domaine destinataire

Portée de clé nécessaire : `analytics.read`.

### `GET /api/v1/suppressions`

Lister les adresses sorties du circuit

Rebonds durs, plaintes et désinscriptions. Un envoi vers une de ces adresses est refusé : les lire évite de réessayer une adresse morte et de faire monter le taux de rebonds.

Portée de clé nécessaire : `contacts.read`.

Paramètres :

- `reason` : Filtre : hard_bounce, soft_bounce_limit, complaint, unsubscribe, manual.
- `since` : Date ISO 8601 à partir de laquelle lire.
- `limit` : Nombre de lignes, 1 à 200.
- `cursor` : Curseur de pagination.

### `GET /v3/smtp/statistics/aggregatedReport`

Rapport agrégé des envois

Rapport agrégé des envois

## Compte

Consommation, quotas, expéditeurs, journal des actions.

### `GET /api/v1/audit-logs`

Journal des actions

Une ligne par appel : quelle clé, quelle opération, quels paramètres, quel résultat. Le corps des messages n'y figure jamais.

Portée de clé nécessaire : `analytics.read`.

Paramètres :

- `operation` : Filtre sur le nom d'opération (email.send, campaign.send...).
- `since` : Date ISO 8601 à partir de laquelle lire.
- `limit` : Nombre de lignes, 1 à 200.
- `cursor` : Curseur de pagination.

### `GET /api/v1/usage`

Consommation et plafonds

Quota mensuel, envois du jour, et pour la clé utilisée : ses portées, son plafond journalier et ce qu'il en reste. Un agent qui ne sait pas ce qu'il lui reste ne peut pas décider de s'arrêter.

Portée de clé nécessaire : `billing.read`.

### `GET /v3/account`

Informations du compte

Informations du compte

### `GET /v3/senders`

Lister les expéditeurs

Lister les expéditeurs

### `POST /v3/senders`

Déclarer un expéditeur

Déclarer un expéditeur

### `DELETE /v3/senders/{id}`

Supprimer un expéditeur

Supprimer un expéditeur

⚠ Action irréversible : à ne pas lancer sans validation humaine explicite.

> Action irréversible. À ne pas déclencher sans validation humaine explicite.

## Webhooks

Abonnement aux événements d'envoi.

### `GET /v3/webhooks`

Lister les webhooks

Lister les webhooks

### `POST /v3/webhooks`

Créer un webhook

Créer un webhook

### `GET /v3/webhooks/{id}`

Lire un webhook

Lire un webhook

### `PUT /v3/webhooks/{id}`

Modifier un webhook

Modifier un webhook

### `DELETE /v3/webhooks/{id}`

Supprimer un webhook

Supprimer un webhook

⚠ Action irréversible : à ne pas lancer sans validation humaine explicite.

> Action irréversible. À ne pas déclencher sans validation humaine explicite.

## Prospection

Séquences à froid : boîtes d'envoi, réponses relevées, désinscriptions. Module activable par compte.

### `GET /v3/outreach/campaigns`

Lister les séquences

Lister les séquences

### `POST /v3/outreach/campaigns`

Créer une séquence

Créer une séquence

### `GET /v3/outreach/campaigns/{id}`

Lire une séquence

Lire une séquence

### `PUT /v3/outreach/campaigns/{id}`

Modifier une séquence

Modifier une séquence

### `DELETE /v3/outreach/campaigns/{id}`

Supprimer une séquence

Supprimer une séquence

⚠ Action irréversible : à ne pas lancer sans validation humaine explicite.

> Action irréversible. À ne pas déclencher sans validation humaine explicite.

### `POST /v3/outreach/campaigns/{id}/enroll`

Inscrire des prospects dans une séquence

Inscrire des prospects dans une séquence

Débit : 60 requêtes par minute.

### `GET /v3/outreach/campaigns/{id}/stats`

Statistiques d'une séquence

Statistiques d'une séquence

### `POST /v3/outreach/campaigns/{id}/status`

Démarrer, mettre en pause ou arrêter une séquence

Passer en « running » déclenche des envois réels aux prospects inscrits.

### `GET /v3/outreach/identity`

Lire l'identification légale de l'expéditeur

Lire l'identification légale de l'expéditeur

### `PUT /v3/outreach/identity`

Déclarer l'identification légale de l'expéditeur

Raison sociale et adresse postale, reprises au pied de chaque message (L.34-5 du CPCE). Tant qu'elles sont vides, l'inscription en campagne et le démarrage sont refusés.

### `GET /v3/outreach/inbox`

Lister les réponses reçues

Réponses relevées en IMAP sur les boîtes d'envoi du compte, classées (intéressé, refus, absence, désinscription). C'est la seule voie entrante de VaEmail à ce jour : elle est rattachée à une séquence, ce n'est pas une boîte générique.

### `GET /v3/outreach/inbox/{id}`

Lire une réponse

Lire une réponse

### `PUT /v3/outreach/inbox/{id}`

Changer le classement ou l'état d'une réponse

Changer le classement ou l'état d'une réponse

### `POST /v3/outreach/inbox/{id}/reply`

Répondre à un prospect

Envoie la réponse depuis la boîte qui a reçu le message, dans le même fil.

Débit : 30 requêtes par minute.

### `GET /v3/outreach/mailboxes`

Lister les boîtes d'envoi et leur santé

Lister les boîtes d'envoi et leur santé

### `POST /v3/outreach/mailboxes`

Déclarer une boîte d'envoi

Déclarer une boîte d'envoi

### `GET /v3/outreach/mailboxes/{id}`

Lire une boîte d'envoi

Lire une boîte d'envoi

### `PUT /v3/outreach/mailboxes/{id}`

Modifier une boîte d'envoi

Modifier une boîte d'envoi

### `DELETE /v3/outreach/mailboxes/{id}`

Supprimer une boîte d'envoi

Supprimer une boîte d'envoi

⚠ Action irréversible : à ne pas lancer sans validation humaine explicite.

> Action irréversible. À ne pas déclencher sans validation humaine explicite.

### `GET /v3/outreach/prospects`

Lister les prospects

Lister les prospects

### `POST /v3/outreach/prospects`

Ajouter des prospects

Ajouter des prospects

Débit : 60 requêtes par minute.

### `DELETE /v3/outreach/prospects`

Supprimer des prospects en lot

Supprimer des prospects en lot

⚠ Action irréversible : à ne pas lancer sans validation humaine explicite.

> Action irréversible. À ne pas déclencher sans validation humaine explicite.

### `GET /v3/outreach/prospects/{id}`

Lire un prospect

Lire un prospect

### `PUT /v3/outreach/prospects/{id}`

Modifier un prospect

Modifier un prospect

### `DELETE /v3/outreach/prospects/{id}`

Supprimer un prospect

Supprimer un prospect

⚠ Action irréversible : à ne pas lancer sans validation humaine explicite.

> Action irréversible. À ne pas déclencher sans validation humaine explicite.

## Médiathèque

Images hébergées pour les campagnes.

### `GET /v3/media`

Lister les images

Lister les images

### `POST /v3/media`

Téléverser une image

Téléverser une image

Débit : 60 requêtes par minute.

### `GET /v3/media/{uuid}`

Lire une image

Lire une image

### `DELETE /v3/media/{uuid}`

Supprimer une image

Supprimer une image

⚠ Action irréversible : à ne pas lancer sans validation humaine explicite.

> Action irréversible. À ne pas déclencher sans validation humaine explicite.

## RGPD

Export et effacement des données d'un contact.

### `POST /api/v1/contacts/erase`

Effacer les données d'un contact

Action irréversible : les données personnelles sont supprimées, l'adresse reste en liste de suppression pour ne pas être recontactée.

Portée de clé nécessaire : `contacts.write`.

### `GET /api/v1/contacts/export`

Exporter les données d'un contact

Exporter les données d'un contact

Portée de clé nécessaire : `contacts.read`.
