Présentation
L’API AMPA est une API REST : vous envoyez des requêtes HTTPS avec un corps JSON (UTF-8) et recevez des réponses JSON. Elle couvre deux besoins :
- Emails transactionnels : un email déclenché par une action dans votre application (inscription, mot de passe oublié, facture, rappel). Il part immédiatement, à une ou quelques personnes.
- Contacts et groupes : vos utilisateurs sont ajoutés, mis à jour ou désabonnés automatiquement dans AMPA. Vous leur écrivez ensuite en campagne depuis le tableau de bord (rentrée, newsletter, annonce).
Adresse de base de toutes les requêtes :
Démarrage rapide
- Choisissez l’adresse d’expédition. Votre adresse offerte en
…ampamail.comfonctionne tout de suite. Pour envoyer depuis votre propre domaine (noreply@votre-ecole.dz), ajoutez-le dans Noms de domaine et publiez les enregistrements DNS indiqués (SPF, DKIM). - Créez une clé API dans Clés API. Donnez-lui les permissions utiles : Envoi d’emails et/ou Contacts et groupes. Copiez-la : elle ne sera plus affichée.
- Enregistrez-la côté serveur, par exemple dans la variable d’environnement
AMPA_API_KEY, puis envoyez votre premier email avec l’exemple ci-dessous.
curl -X POST https://ampamail.com/api/v1/emails/send \
-H "Authorization: Bearer ampa_live_VOTRE_CLE" \
-H "Content-Type: application/json" \
-d '{
"from": "noreply@votre-domaine.dz",
"from_name": "Mon École",
"to": ["parent@example.com"],
"subject": "Bienvenue {{ prenom }} !",
"html": "<p>Bonjour {{ prenom }}, votre compte est prêt.</p>",
"variables": {"prenom": "Amina"}
}'Authentification
Chaque requête porte votre clé, au choix dans l’un de ces en-têtes :
Authorization: Bearer ampa_live_xxxxxxxxxxxxxxxxxxxxxxxx # ou X-API-Key: ampa_live_xxxxxxxxxxxxxxxxxxxxxxxx
Une clé appartient à une organisation : elle ne voit que ses données. Ses permissions limitent ce qu’elle peut faire :
| Permission | Donne accès à |
|---|---|
emails | Envoyer des emails et consulter leur statut (/emails…). |
contacts | Créer, lire, désabonner et supprimer des contacts ; lister les groupes (/audience…). |
Envoyer un email
| Champ | Type | Description |
|---|---|---|
fromrequis | Adresse d’expédition, sur un domaine vérifié de votre organisation (ou votre adresse offerte en …ampamail.com). | |
from_name | texte | Nom affiché de l’expéditeur, ex. « Mon École ». 120 caractères max. |
torequis | liste d’emails | De 1 à 50 destinataires. Chacun reçoit son propre email : les destinataires ne se voient pas entre eux. |
subject | texte | Objet. Requis sans template_id. 255 caractères max. |
html | texte | Contenu HTML. |
text | texte | Version texte. Fournissez html, text ou les deux (recommandé), ou un template_id. |
template_id | identifiant | Utilise un modèle enregistré dans AMPA (objet, HTML et texte). |
variables | objet | Valeurs des variables {{ … }} utilisées dans l’objet et le contenu. |
Réponse 202 Accepted : l’email est enregistré et mis en file d’envoi. Il part en général en quelques secondes. Conservez l’id pour suivre l’envoi.
HTTP/1.1 202 Accepted
{
"results": [
{ "to": "parent@example.com", "id": "8f2c1a4e-5b1d-4f7a-9c33-2a6e0d1b7c90", "status": "queued" }
]
}"status": "suppressed" et rien ne lui est envoyé. Cela protège la réputation de vos envois.Variables et modèles
Écrivez {{ prenom }} dans l’objet ou le contenu ; la valeur vient de variables. La variable {{ email }} (adresse du destinataire) est toujours disponible. Les conditions sont possibles : {% if code %}Votre code : {{ code }}{% endif %}.
Dans le HTML, les valeurs sont échappées automatiquement : un nom contenant <script> s’affiche comme du texte, sans danger.
Pour ne pas mettre de HTML dans votre code, créez le modèle dans Modèles (éditeur visuel), copiez son identifiant et envoyez-le avec template_id :
curl -X POST https://ampamail.com/api/v1/emails/send \
-H "Authorization: Bearer ampa_live_VOTRE_CLE" \
-H "Content-Type: application/json" \
-d '{
"from": "noreply@votre-domaine.dz",
"to": ["eleve@example.com"],
"template_id": "3b9d6f0e-1c2a-4e8b-a7f5-6d4c2b1a0e99",
"variables": {"prenom": "Karim", "code": "451236"}
}'Éviter les doublons
Si la connexion coupe pendant un envoi, votre serveur ne sait pas si l’email est parti. En renvoyant la requête, vous risquez un double email. Ajoutez l’en-tête Idempotency-Key avec une valeur unique pour l’opération (numéro de facture, identifiant de demande…) :
curl -X POST https://ampamail.com/api/v1/emails/send \
-H "Authorization: Bearer ampa_live_VOTRE_CLE" \
-H "Idempotency-Key: facture-2026-00451" \
-H "Content-Type: application/json" \
-d '{ ... }'- Même clé et même contenu dans les 24 h : AMPA renvoie la réponse du premier appel, sans nouvel envoi (en-tête
Idempotent-Replayed: true). - Même clé avec un contenu différent : erreur 422, pour éviter une confusion.
- Deux appels simultanés avec la même clé : le second reçoit 409 ; réessayez une seconde plus tard.
Suivre les envois
# Un email précis curl https://ampamail.com/api/v1/emails/8f2c1a4e-5b1d-4f7a-9c33-2a6e0d1b7c90 \ -H "Authorization: Bearer ampa_live_VOTRE_CLE" # Les 20 derniers échecs curl "https://ampamail.com/api/v1/emails?status=failed&limit=20" \ -H "Authorization: Bearer ampa_live_VOTRE_CLE"
{
"id": "8f2c1a4e-5b1d-4f7a-9c33-2a6e0d1b7c90",
"to": "parent@example.com",
"from": "Mon École <noreply@votre-domaine.dz>",
"subject": "Bienvenue Amina !",
"status": "sent",
"error": null,
"created_at": "2026-10-09T14:02:11.402Z",
"sent_at": "2026-10-09T14:02:12.918Z"
}| Statut | Signification |
|---|---|
queued | En file d’envoi. |
sent | Remis au serveur du destinataire (Gmail, Outlook…). |
failed | Non envoyé ; la raison est dans error. |
bounced | Refusé par le serveur du destinataire (adresse inexistante, boîte pleine…). L’adresse est ajoutée à la liste de blocage. |
La liste renvoie {"total": …, "items": [...]}, du plus récent au plus ancien ; limit va jusqu’à 100. Vous trouvez aussi le journal des envois dans Clés API du tableau de bord.
Créer ou mettre à jour un contact
Le contact est identifié par son adresse email : s’il existe, il est mis à jour ; sinon il est créé. Vous pouvez donc appeler cette route à chaque inscription ou modification de profil sans vérifier avant.
| Champ | Type | Description |
|---|---|---|
emailrequis | Adresse du contact (identifiant). | |
first_name, last_name | texte | Prénom et nom. 80 caractères max. Un champ absent n’est pas modifié. |
phone | texte | Téléphone. 30 caractères max. |
custom_fields | objet | Vos informations (classe, ville, n° client…), fusionnées avec les existantes. Utilisables dans les campagnes : {{ classe }}. |
groups | liste de noms | Groupes où ranger le contact (20 max). Un groupe qui n’existe pas est créé. Le contact n’est pas retiré de ses autres groupes. |
curl -X PUT https://ampamail.com/api/v1/audience/contacts \
-H "Authorization: Bearer ampa_live_VOTRE_CLE" \
-H "Content-Type: application/json" \
-d '{
"email": "parent@example.com",
"first_name": "Amina",
"last_name": "Benali",
"phone": "+213555123456",
"custom_fields": {"classe": "6e A", "eleve": "Yacine"},
"groups": ["Parents d’élèves", "Rentrée 2026"]
}'{
"created": true,
"contact": {
"id": "c1e0b6a2-…",
"email": "parent@example.com",
"first_name": "Amina",
"last_name": "Benali",
"phone": "+213555123456",
"status": "subscribed",
"custom_fields": {"classe": "6e A", "eleve": "Yacine"},
"groups": ["Parents d’élèves", "Rentrée 2026"],
"created_at": "2026-10-09T14:05:40Z",
"updated_at": "2026-10-09T14:05:40Z"
}
}Synchroniser en lot
Jusqu’à 500 contacts par appel, mêmes champs que ci-dessus. Pratique pour un import initial ou une synchronisation nocturne : découpez vos utilisateurs en paquets de 500.
curl -X POST https://ampamail.com/api/v1/audience/contacts/batch \
-H "Authorization: Bearer ampa_live_VOTRE_CLE" \
-H "Content-Type: application/json" \
-d '{
"contacts": [
{"email": "prof.math@example.com", "first_name": "Karim", "groups": ["Enseignants"]},
{"email": "secretariat@example.com", "groups": ["Administration"]}
]
}'
# Réponse : {"created": 2, "updated": 0, "total": 2}Désabonner, consulter, supprimer
Appelez unsubscribe quand la personne refuse les communications depuis votre plateforme : elle ne recevra plus de campagnes. La suppression efface le contact (droit à l’effacement) ; un désabonnement reste mémorisé pour ne pas lui écrire à nouveau.
# La personne s’est désabonnée depuis votre plateforme curl -X POST https://ampamail.com/api/v1/audience/contacts/parent@example.com/unsubscribe \ -H "Authorization: Bearer ampa_live_VOTRE_CLE" # Consulter un contact curl https://ampamail.com/api/v1/audience/contacts/parent@example.com \ -H "Authorization: Bearer ampa_live_VOTRE_CLE" # Supprimer un contact (droit à l’effacement) curl -X DELETE https://ampamail.com/api/v1/audience/contacts/parent@example.com \ -H "Authorization: Bearer ampa_live_VOTRE_CLE"
Lister les groupes
curl https://ampamail.com/api/v1/audience/groups -H "Authorization: Bearer ampa_live_VOTRE_CLE"
{
"groups": [
{"id": "1ba88f96-…", "name": "Administration", "description": null, "contacts": 12},
{"id": "7c2d01e5-…", "name": "Parents d’élèves", "description": "Rentrée 2026", "contacts": 431}
]
}Erreurs
En cas d’erreur, la réponse contient un champ detail qui explique le problème en français :
HTTP/1.1 400 Bad Request
{
"detail": "L'adresse d'expédition doit utiliser un domaine vérifié de votre organisation (gmail.com ne l'est pas)."
}| Code | Cause | Que faire |
|---|---|---|
| 400 | Requête refusée (expéditeur non vérifié, statut inconnu…) | Corriger la requête. |
| 401 | Clé absente, invalide ou révoquée | Vérifier la clé. |
| 403 | La clé n’a pas la permission nécessaire | Créer une clé avec la bonne permission. |
| 404 | Élément introuvable (ou appartenant à une autre organisation) | Vérifier l’identifiant. |
| 409 | Requête identique déjà en cours (Idempotency-Key) | Réessayer dans une seconde. |
| 422 | Champ manquant ou invalide ; detail liste les champs en cause | Corriger les données. |
| 429 | Trop de requêtes pour cette clé | Attendre (en-tête Retry-After), puis réessayer. |
| 5xx | Incident temporaire de notre côté | Réessayer plus tard, avec la même Idempotency-Key. |
Limites
| Requêtes | 100 par minute et par clé (toutes routes confondues) |
| Destinataires | 50 par appel à /emails/send |
| Taille | HTML 500 000 caractères, texte 200 000 |
| Contacts en lot | 500 par appel |
| Idempotency-Key | 100 caractères, mémorisée 24 h |
Exemple complet d’intégration
Une plateforme scolaire qui, à l’inscription d’un parent, l’ajoute au groupe « Parents d’élèves » puis lui envoie l’email de bienvenue, et qui envoie les codes de réinitialisation de mot de passe :
<?php
// ampa.php — petit client réutilisable
function ampa(string $method, string $path, array $body = null, array $headers = []): array
{
$ch = curl_init('https://ampamail.com/api/v1' . $path);
$headers[] = 'Authorization: Bearer ' . getenv('AMPA_API_KEY');
$headers[] = 'Content-Type: application/json';
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => $method,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 10,
CURLOPT_HTTPHEADER => $headers,
]);
if ($body !== null) curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($body));
$data = json_decode(curl_exec($ch), true);
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($code >= 400) throw new RuntimeException("AMPA $code : " . json_encode($data['detail'] ?? $data));
return $data;
}
// 1. À l’inscription d’un parent : contact + groupe, puis email de bienvenue
ampa('PUT', '/audience/contacts', [
'email' => $parent->email,
'first_name' => $parent->prenom,
'custom_fields' => ['eleve' => $eleve->prenom, 'classe' => $eleve->classe],
'groups' => ['Parents d’élèves'],
]);
ampa('POST', '/emails/send', [
'from' => 'noreply@votre-ecole.dz',
'from_name' => 'Votre École',
'to' => [$parent->email],
'template_id' => getenv('AMPA_TEMPLATE_BIENVENUE'),
'variables' => ['prenom' => $parent->prenom, 'eleve' => $eleve->prenom],
], ['Idempotency-Key: bienvenue-' . $parent->id]);
// 2. Mot de passe oublié : code à usage unique
ampa('POST', '/emails/send', [
'from' => 'securite@votre-ecole.dz',
'to' => [$user->email],
'subject' => 'Votre code : {{ code }}',
'text' => "Votre code de réinitialisation est {{ code }}. Il expire dans 10 minutes.",
'variables' => ['code' => $code],
], ['Idempotency-Key: reset-' . $demande->id]);Bonnes pratiques
- N’attendez pas l’email dans la requête de l’utilisateur : appelez AMPA depuis une tâche en arrière-plan (file de travail) quand c’est possible.
- Réessayez intelligemment : sur 429 et 5xx uniquement, après 1 s, 5 s puis 30 s, toujours avec la même
Idempotency-Key. - Un domaine vérifié (SPF, DKIM, DMARC) améliore fortement l’arrivée en boîte de réception.
- Une version texte en plus du HTML réduit le risque d’être classé en spam.
- Synchronisez les désabonnements de votre plateforme avec
unsubscribe, pour respecter le choix de vos utilisateurs.
Une question sur l’intégration ? Écrivez-nous à contact@ampamail.com.