MailLandDocs
Envío de emails

Envío por lotes

Envíe correos electrónicos a múltiples destinatarios en una sola llamada API

El envío por lotes solo está disponible con credenciales de flujo Marketing. Las credenciales transaccionales devuelven 400 BATCH_NOT_ALLOWED_FOR_TRANSACTIONAL. Esto previene el uso indebido de flujos transaccionales para correo masivo.

Enviar un lote

POST https://api.mail.land/v1/transactional/send-batch
Enviar un correo por lotes
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"
  }'

Campos de la solicitud

CampoTipoRequeridoDescripción
fromobjectSíDirección del remitente (email y name opcional)
recipientsarraySíLista de destinatarios (nota: recipients, no to)
recipients[].emailstringSíCorreo del destinatario
recipients[].namestringNoNombre para mostrar del destinatario
recipients[].variablesobjectNoVariables de plantilla por destinatario
subjectstringCondicionalRequerido a menos que se use templateId
templateIdstringNoUsar una plantilla almacenada
htmlContentstringCondicionalCuerpo HTML (requerido si no hay templateId)
textContentstringNoTexto plano alternativo
variablesobjectNoVariables globales. Se aplican tanto si se define templateId como si no; ante una clave superpuesta, gana el valor propio del destinatario en recipients[].variables
replyTostringNoDirección de respuesta
batchNamestringNoNombre legible para este lote
tagsarrayNoEtiquetas para analíticas y filtrado de webhooks
customHeadersobjectNoEncabezados de correo personalizados
trackingobjectNoSobrescritura de seguimiento de aperturas/clics
ipPoolIdstringNoReservado para pools de IP dedicadas. Aún no disponible: enviarlo devuelve 400 IP_POOL_NOT_FOUND. Omítalo.
scheduledAtdatetimeNoProgramar para entrega futura, hasta 7 días de antelación
externalBatchIdstringNoIdentificador de lote de su sistema: si se envía, se devuelve tal cual como batchId en la respuesta
priorityenumNoLow, Normal (por defecto), High, Critical
idempotencyKeystringNoEvita envíos duplicados con la misma clave. Se prefiere el encabezado X-Idempotency-Key

Note la diferencia en el nombre del campo: el envío por lotes usa recipients mientras que el envío individual usa to.

Respuesta

Estado: 202 Accepted

Respuesta del lote
{
  "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
}
CampoTipoDescripción
batchIdstringIdentificador único del lote
messageIdsarrayIDs de mensaje por destinatario (con prefijo m_ para marketing)
totalRecipientsintTotal de destinatarios en la solicitud
acceptedCountintDestinatarios aceptados para entrega
rejectedCountintDestinatarios rechazados
rejectedRecipientsarrayDetalles de los destinatarios rechazados con motivos
estimatedCompletiondatetimeTiempo estimado para completar el procesamiento del lote

Combinación de variables

Las variables por destinatario sobrescriben las variables globales cuando las claves coinciden:

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

Manejo de errores

Errores específicos del envío por lotes:

EstadoCódigoDescripción
400BATCH_NOT_ALLOWED_FOR_TRANSACTIONALLa credencial transaccional no puede enviar lotes
400VALIDATION_FAILEDSe excedió el máximo de destinatarios por lote (10.000)
400INVALID_REQUESTscheduledAt con más de 7 días de antelación ("Cannot schedule email more than 7 days in advance")
400TEMPLATE_NOT_FOUNDtemplateId no nombra ninguna plantilla activa de esta cuenta (también se devuelve para una plantilla eliminada)
400IP_POOL_NOT_FOUNDipPoolId no nombra ningún pool asignado a esta cuenta
422TEMPLATE_VARIABLE_MISSINGTodos los destinatarios carecen de valor para un {{placeholder}} (si solo faltan en algunos, se omiten y se listan en rejectedRecipients con el motivo template_variable_missing: name). No se encola nada
400BATCH_SEND_FAILEDTodos los destinatarios están suprimidos
429RATE_LIMIT_EXCEEDEDLímite de velocidad excedido (a nivel de workspace/plan, no por credencial)
429QUOTA_EXCEEDEDCuota mensual agotada

Los códigos de verificación de cuenta y de política documentados para POST /v1/transactional/send (SENDING_BLOCKED, ACTION_REQUIRED, DAILY_LIMIT_EXCEEDED, MARKETING_PAUSED y el resto) también se aplican aquí.

Es posible un éxito parcial: algunos destinatarios pueden ser aceptados mientras otros son rechazados (por ejemplo, direcciones suprimidas). Verifique rejectedRecipients en la respuesta.

Próximos pasos

En esta página