API REST · JSON · v1

Intégrez AMPA à votre plateforme

Envoyez des emails depuis votre site ou votre application (bienvenue, codes, factures, alertes) et gardez vos contacts synchronisés avec vos groupes, sans ressaisie.

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 :

https://ampamail.com/api/v1

Démarrage rapide

  1. Choisissez l’adresse d’expédition. Votre adresse offerte en …ampamail.com fonctionne 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).
  2. 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.
  3. 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 :

PermissionDonne accès à
emailsEnvoyer des emails et consulter leur statut (/emails…).
contactsCréer, lire, désabonner et supprimer des contacts ; lister les groupes (/audience…).
La clé est un secret. Utilisez-la uniquement sur votre serveur : jamais dans une page web, une application mobile ou un dépôt de code public. Créez une clé par application, avec seulement les permissions nécessaires. En cas de fuite, révoquez-la dans Clés API : elle cesse de fonctionner immédiatement.

Envoyer un email

POST/api/v1/emails/sendpermission : emails
ChampTypeDescription
fromrequisemailAdresse d’expédition, sur un domaine vérifié de votre organisation (ou votre adresse offerte en …ampamail.com).
from_nametexteNom affiché de l’expéditeur, ex. « Mon École ». 120 caractères max.
torequisliste d’emailsDe 1 à 50 destinataires. Chacun reçoit son propre email : les destinataires ne se voient pas entre eux.
subjecttexteObjet. Requis sans template_id. 255 caractères max.
htmltexteContenu HTML.
texttexteVersion texte. Fournissez html, text ou les deux (recommandé), ou un template_id.
template_ididentifiantUtilise un modèle enregistré dans AMPA (objet, HTML et texte).
variablesobjetValeurs 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" }
  ]
}
Un destinataire qui s’est désabonné ou dont l’adresse n’existe pas (rebond) est sur votre liste de blocage : il apparaît avec "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

GET/api/v1/emails/{id}permission : emails
GET/api/v1/emails?status=&to=&limit=&offset=permission : emails
# 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"
Réponse
{
  "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"
}
StatutSignification
queuedEn file d’envoi.
sentRemis au serveur du destinataire (Gmail, Outlook…).
failedNon envoyé ; la raison est dans error.
bouncedRefusé 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

PUT/api/v1/audience/contactspermission : contacts

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.

ChampTypeDescription
emailrequisemailAdresse du contact (identifiant).
first_name, last_nametextePrénom et nom. 80 caractères max. Un champ absent n’est pas modifié.
phonetexteTéléphone. 30 caractères max.
custom_fieldsobjetVos informations (classe, ville, n° client…), fusionnées avec les existantes. Utilisables dans les campagnes : {{ classe }}.
groupsliste de nomsGroupes 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"]
  }'
Réponse
{
  "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"
  }
}
Le consentement est respecté. Un contact désabonné le reste, même si vous le synchronisez à nouveau ; une adresse en liste de blocage est créée comme désabonnée. Seule la personne peut se réabonner.

Synchroniser en lot

POST/api/v1/audience/contacts/batchpermission : contacts

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

POST/api/v1/audience/contacts/{email}/unsubscribepermission : contacts
GET/api/v1/audience/contacts/{email}permission : contacts
DELETE/api/v1/audience/contacts/{email}permission : contacts

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

GET/api/v1/audience/groupspermission : contacts
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)."
}
CodeCauseQue faire
400Requête refusée (expéditeur non vérifié, statut inconnu…)Corriger la requête.
401Clé absente, invalide ou révoquéeVérifier la clé.
403La clé n’a pas la permission nécessaireCréer une clé avec la bonne permission.
404Élément introuvable (ou appartenant à une autre organisation)Vérifier l’identifiant.
409Requête identique déjà en cours (Idempotency-Key)Réessayer dans une seconde.
422Champ manquant ou invalide ; detail liste les champs en causeCorriger les données.
429Trop de requêtes pour cette cléAttendre (en-tête Retry-After), puis réessayer.
5xxIncident temporaire de notre côtéRéessayer plus tard, avec la même Idempotency-Key.

Limites

Requêtes100 par minute et par clé (toutes routes confondues)
Destinataires50 par appel à /emails/send
TailleHTML 500 000 caractères, texte 200 000
Contacts en lot500 par appel
Idempotency-Key100 caractères, mémorisée 24 h
L’API sert aux emails individuels. Pour écrire à tout un groupe (newsletter, annonce), créez une campagne dans le tableau de bord : elle gère le rythme d’envoi, le lien de désabonnement obligatoire et les statistiques d’ouverture et de clic.

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.