PATCH /api/v1/campaigns/{campaignId}
Edita una campaña en borrador. Una campaña se crea con una copia del HTML de su plantilla y después vive por su cuenta: este endpoint edita esa copia (el HTML que realmente se envía) sin tocar la plantilla. Una campaña que ya se ha enviado o se está enviando queda congelada y devuelve 400.
Todos los campos son opcionales; solo cambian los que envías. tagId, topicId y sendingIdentityId siguen la misma regla con un null explícito: omitir el campo conserva lo que hay, enviar null lo borra. Es la única forma de separar un tema editorial de un borrador: consulta Temas.
Las etiquetas de combinación de Mailchimp en el HTML se convierten como al crear una plantilla; cualquier etiqueta no compatible se devuelve en unsupportedTags.
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 del borrador que se edita |
Cuerpo de la solicitud
| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
content | string | no | El HTML del correo |
subject | string | no | De 1 a 200 caracteres |
previewText | string | null | no | Texto de vista previa, hasta 200 caracteres tras recortar espacios. null lo borra; omitido en PATCH lo conserva. Se renderiza en {{previewText}} o {{preheader}} |
preheader | string | null | no | Alias compatible de previewText. Si se envían ambos, deben coincidir tras recortar espacios; si no, 400 |
name | string | no | De 1 a 100 caracteres |
listId | string | no | Cambia el objetivo de la campaña; debe pertenecer a la organización |
tagId | string | no | Acota el objetivo a una etiqueta, o null para borrarla |
topicId | string | no | Tema editorial que lleva la campaña, o null para borrarlo |
templateId | string | no | Vuelve a vincular la plantilla de origen; debe pertenecer a la organización |
sendingIdentityId | string | no | Cambia la dirección que firma, o null para volver a la predeterminada |
json
{"previewText": "Timely m’a bloqué mes paiements Stripe pendant 5 jours."}null incluido; valores en conflicto devuelven 400. Una cadena vacía también elimina el texto de vista previa.
Ejemplo
bash
curl -X PATCH -H "x-api-key: $AGENTMAIL_API_KEY" -H "content-type: application/json" \
https://www.agentsmail.io/api/v1/campaigns/$CAMPAIGN_ID \
-d '{ "previewText": "Timely m’a bloqué mes paiements Stripe pendant 5 jours.", "content": "<html><body><div data-skip-in-text=\"true\" style=\"display:none;max-height:0;overflow:hidden;mso-hide:all;\">{{previewText}}</div><p>Hi {{firstName}}</p><a href=\"{{unsubscribeUrl}}\">Unsubscribe</a></body></html>" }'Respuesta
-
400 Bad Request: campos no válidos, texto de vista previa de más de 200 caracteres o alias en conflicto. -
200 OK: la llamada tuvo éxito. -
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 ese recurso, o pertenece a otra organización. La API nunca confirma que un id existe a quien no tiene derecho sobre él. -
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 | object | Objeto de campaña. |
data.campaignUrl | string | null | Página de la campaña. |
data.campaignEditorUrl | string | null | Editor del contenido de un borrador editable. |
data.campaignStatsUrl | string | null | Estadísticas de una campaña enviada. |
data.campaignPreviewUrl | string | null | Vista previa interna de una campaña enviada. |
data.publicCampaignUrl | string | null | Archivo compartible de una campaña enviada con archivos públicos activados. |
data.id | string | Identificador único de la campaña |
data.name | string | Su nombre interno |
data.subject | string | El asunto que ven los destinatarios |
data.previewText | string | null | Texto de vista previa guardado; igual a data.preheader |
data.preheader | string | null | El texto de vista previa que se muestra tras el asunto, null si no hay |
data.status | string | draft, scheduled, paused, sending, sent, failed |
data.listId | string | La lista a la que apunta |
data.tagId | string | null |
data.topicId | string | null |
data.scheduledAt | string | null |
data.sentAt | string | null |
data.createdAt | string | Fecha ISO de creación |
data.updatedAt | string | Fecha ISO del último cambio |
en por defecto). Los enlaces no disponibles son null; todos son null si la organización no tiene slug de URL. Los enlaces internos requieren iniciar sesión y tener acceso a la organización; solo publicCampaignUrl es público. Los agentes API y MCP muestran las URL pertinentes no nulas como enlaces Markdown, por ejemplo [Abrir campaña](campaignUrl) con la URL recibida. Crear o consultar una campaña no la publica.
Ejemplo de respuesta
json
{
"success": true,
"data": {
"id": "4d19c0a2",
"name": "Newsletter",
"subject": "August news",
"previewText": "Three new things this month",
"preheader": "Three new things this month",
"status": "draft",
"listId": "0b7c51e8",
"tagId": "7c2ef4b1",
"topicId": null,
"scheduledAt": null,
"sentAt": null,
"createdAt": "2026-08-23T10:22:05.000Z",
"updatedAt": "2026-08-23T10:22:05.000Z",
"campaignUrl": "https://www.agentsmail.io/es/team/my-team/campaigns/4d19c0a2",
"campaignEditorUrl": "https://www.agentsmail.io/es/team/my-team/campaigns/4d19c0a2/content",
"campaignStatsUrl": null,
"campaignPreviewUrl": null,
"publicCampaignUrl": null
}
}Notas
El HTML debe contener{{previewText}} o {{preheader}}, normalmente en un bloque oculto. AgentsMail no inserta ningún bloque. Consulta Etiquetas de combinación.