MailLandDocs
Envoi d'emails

Envoi par lot

Envoyez des e-mails a plusieurs destinataires en un seul appel API

L'envoi par lot est uniquement disponible avec les identifiants de flux Marketing. Les identifiants transactionnels retournent 400 BATCH_NOT_ALLOWED_FOR_TRANSACTIONAL. Cela empeche l'utilisation abusive des flux transactionnels pour l'envoi d'e-mails en masse.

Envoyer un lot

POST https://api.mail.land/v1/transactional/send-batch
Envoyer un e-mail par lot
curl -X POST https://api.mail.land/v1/transactional/send-batch \
  -H "X-API-Key: ml_pem_Ab3Kx9mN2pQ7rT4wL8yD..." \
  -H "Content-Type: application/json" \
  -d '{
    "from": {
      "email": "[email protected]",
      "name": "Your Company"
    },
    "recipients": [
      {
        "email": "[email protected]",
        "name": "Alice",
        "variables": { "firstName": "Alice", "plan": "Pro" }
      },
      {
        "email": "[email protected]",
        "name": "Bob",
        "variables": { "firstName": "Bob", "plan": "Starter" }
      }
    ],
    "subject": "Hi {{firstName}}, check out what'\''s new",
    "htmlContent": "<h1>Hey {{firstName}}!</h1><p>Your {{plan}} plan just got an upgrade.</p>",
    "variables": {
      "companyName": "Acme Inc",
      "year": "2026"
    },
    "tags": ["product-update", "february-2026"],
    "batchName": "February Product Update"
  }'

Champs de la requete

ChampTypeRequisDescription
fromobjectOuiAdresse de l'expediteur (email et name optionnel)
recipientsarrayOuiListe des destinataires (note : recipients, pas to)
recipients[].emailstringOuiE-mail du destinataire
recipients[].namestringNonNom d'affichage du destinataire
recipients[].variablesobjectNonVariables de template par destinataire
subjectstringConditionnelRequis sauf si vous utilisez templateId
templateIdstringNonUtiliser un template enregistre
htmlContentstringConditionnelCorps HTML (requis si pas de templateId)
textContentstringNonTexte brut de remplacement
variablesobjectNonVariables globales. Appliquées que templateId soit défini ou non ; en cas de clé identique, la valeur propre du destinataire dans recipients[].variables l'emporte
replyTostringNonAdresse de reponse
batchNamestringNonNom lisible pour ce lot
tagsarrayNonTags pour les statistiques et le filtrage des webhooks
customHeadersobjectNonEn-tetes d'e-mail personnalises
trackingobjectNonRemplacement du suivi des ouvertures/clics
ipPoolIdstringNonRéservé aux pools d'IP dédiées. Pas encore disponible : l'envoyer renvoie 400 IP_POOL_NOT_FOUND. À omettre.
scheduledAtdatetimeNonPlanifier pour un envoi futur, jusqu'à 7 jours à l'avance
externalBatchIdstringNonIdentifiant de lot de votre système : s'il est fourni, il est renvoyé tel quel comme batchId dans la réponse
priorityenumNonLow, Normal (par defaut), High, Critical
idempotencyKeystringNonEmpeche les envois en double pour la meme cle. L'en-tete X-Idempotency-Key est prefere

Notez la difference de nom de champ : l'envoi par lot utilise recipients tandis que l'envoi unique utilise to.

Reponse

Statut : 202 Accepted

Reponse de lot
{
  "success": true,
  "batchId": "batch_f47ac10b58cc43729876fedcba098765",
  "messageIds": ["m_a1b2c3...", "m_d4e5f6..."],
  "totalRecipients": 2,
  "acceptedCount": 2,
  "rejectedCount": 0,
  "rejectedRecipients": [],
  "queuedAt": "2026-02-17T10:30:00Z",
  "estimatedCompletion": "2026-02-17T10:35:00Z",
  "isSandboxed": false
}
ChampTypeDescription
batchIdstringIdentifiant unique du lot
messageIdsarrayIdentifiants de message par destinataire (prefixe m_ pour marketing)
totalRecipientsintNombre total de destinataires dans la requete
acceptedCountintDestinataires acceptes pour la livraison
rejectedCountintDestinataires rejetes
rejectedRecipientsarrayDetails des destinataires rejetes avec les raisons
estimatedCompletiondatetimeTemps estime pour la fin du traitement du lot

Fusion des variables

Les variables par destinataire remplacent les variables globales lorsque les cles se chevauchent :

Priorite des variables
{
  "variables": {
    "companyName": "Acme Inc",
    "greeting": "Hello"
  },
  "recipients": [
    {
      "email": "[email protected]",
      "variables": { "greeting": "Dear valued customer" }
    },
    {
      "email": "[email protected]"
    }
  ]
}

Gestion des erreurs

Erreurs specifiques a l'envoi par lot :

StatutCodeDescription
400BATCH_NOT_ALLOWED_FOR_TRANSACTIONALL'identifiant transactionnel ne peut pas envoyer de lots
400VALIDATION_FAILEDNombre maximum de destinataires par lot depasse (10 000)
400INVALID_REQUESTscheduledAt de plus de 7 jours à l'avance ("Cannot schedule email more than 7 days in advance")
400TEMPLATE_NOT_FOUNDtemplateId ne désigne aucun modèle actif de ce compte (également renvoyé pour un modèle supprimé)
400IP_POOL_NOT_FOUNDipPoolId ne désigne aucun pool assigné à ce compte
422TEMPLATE_VARIABLE_MISSINGChaque destinataire n'a pas de valeur pour un {{placeholder}} (si ce n'est le cas que pour certains, ils sont ignorés et listés dans rejectedRecipients avec la raison template_variable_missing: name). Rien n'est mis en file
400BATCH_SEND_FAILEDTous les destinataires sont supprimés
429RATE_LIMIT_EXCEEDEDLimite de débit dépassée (au niveau workspace/plan, pas par identifiant)
429QUOTA_EXCEEDEDQuota mensuel epuise

Les codes de vérification de compte et de politique documentés pour POST /v1/transactional/send (SENDING_BLOCKED, ACTION_REQUIRED, DAILY_LIMIT_EXCEEDED, MARKETING_PAUSED et les autres) s'appliquent également ici.

Un succes partiel est possible -- certains destinataires peuvent etre acceptes tandis que d'autres sont rejetes (ex. : adresses supprimees). Verifiez rejectedRecipients dans la reponse.

Etapes suivantes

Sur cette page