POST /api/v1/campaigns/{campaignId}/schedule
Reserva el envío de una campaña draft para un instante futuro y responde 202. Llamado sobre
una campaña que ya está scheduled, la mueve al nuevo instante. Esta llamada no envía nada:
la campaña sale sola a la hora reservada.
Autorización
| Rol en la organización | Este endpoint |
|---|---|
OWNER | Permitido |
ADMIN | Permitido |
MEMBER | Rechazado — 403 |
Parámetros de ruta
| Parámetro | Tipo | Descripción |
|---|---|---|
campaignId | string | Identificador único de una campaña |
Cuerpo de la solicitud
| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
scheduledAt | string | sí | Instante ISO 8601 con un desfase explícito, al menos un minuto en el futuro |
json
{"scheduledAt": "2026-08-12T07:00:00Z"}Ejemplo
bash
curl -X POST -H "x-api-key: $AGENTMAIL_API_KEY" \
-H "Content-Type: application/json" \
-d '{"scheduledAt": "2026-08-12T07:00:00Z"}' \
"https://www.agentsmail.io/api/v1/campaigns/$CAMPAIGN_ID/schedule"Respuesta
202 Accepted: la campaña quedascheduledpara el instante devuelto enscheduledAt.400 Bad Request:scheduledAtfalta, no tiene desfase, está en el pasado o a menos de un minuto (detailsindica el problema); o el contenido no tiene enlace de baja.401 Unauthorized: clave ausente o no válida, o su propietario dejó la organización.403 Forbidden: el propietario de la clave esmemberde la organización, noadmin.404 Not Found: no existe esa campaña, o pertenece a otra organización. La API nunca confirma que un id existe a quien no tiene derecho sobre él.409 Conflict: el dominio de envío aún no está verificado, el saldo no cubre a los destinatarios de la campaña, su lista se retiró, o la campaña estápaused,sending,sentofailed. No se reserva nada.429 Too Many Requests: más de 120 solicitudes en un minuto para esta clave.
Campos de la respuesta
| Campo | Tipo | Descripción |
|---|---|---|
success | boolean | Indica si la operación tuvo éxito |
data.campaignId | string | La campaña programada |
data.status | string | Siempre scheduled |
data.scheduledAt | string | El instante realmente guardado, en UTC, redondeado al minuto |
Ejemplo de respuesta
json
{
"success": true,
"data": {
"campaignId": "6c6c6c6c-5555-4aaa-8bbb-999900001111",
"status": "scheduled",
"scheduledAt": "2026-08-12T07:00:00.000Z"
}
}Notas
Una fecha sin zona horaria se rechaza; nunca se interpreta como UTC.
2026-08-12T09:00:00
responde 400: la API no adivina un desfase que no escribiste. Escribe 2026-08-12T07:00:00Z o
2026-08-12T09:00:00+02:00: ambos designan el mismo instante.- La programación se guarda al minuto: los segundos que envíes se descartan. Lee
scheduledAten la respuesta para conocer la salida exacta. - Volver a llamarlo sobre una campaña
scheduledmueve la salida; el horario anterior deja de valer. Una campaña nunca tiene más de una salida. - Una campaña
pausedresponde409: reanúdala en la app, o devuélvela a borrador con Desprogramar una campaña y vuelve a programarla. - Para enviar ya, usa Enviar una campaña.
Nunca programes sin la aprobación humana explícita para esa campaña concreta. Una campaña
programada sale sola; la aprobación de un envío nunca cubre el siguiente.