PATCH /api/v1/campaigns/{campaignId}
Edits a draft campaign. A campaign is created with a copy of its template's
HTML, then lives on its own: this endpoint edits that copy — the HTML actually
sent — without touching the template. A campaign that has already been sent or is
sending is frozen and returns 400.
Every field is optional; only those you send are changed.
Mailchimp merge tags in the HTML are converted as on template creation; any
unsupported tag is returned in unsupportedTags.
Authorization
| Role in the organization | This endpoint |
|---|---|
OWNER | Allowed |
ADMIN | Allowed |
MEMBER | Refused — 403 |
Request body
| Field | Type | Required | Description |
|---|---|---|---|
content | string | no | The HTML of the email |
subject | string | no | 1 to 200 characters |
name | string | no | 1 to 100 characters |
listId | string | no | Retargets the campaign; must belong to the org |
tagId | string | no | Narrows the target to a tag, or null to clear |
templateId | string | no | Re-links the source template; must belong to the org |
sendingIdentityId | string | no | Changes the signing address, or null to fall back to the default |
Example
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 '{ "content": "<html><body><p>Hi {{firstName}}</p><a href=\"{{unsubscribeUrl}}\">Unsubscribe</a></body></html>" }'Response
200 OK— the call succeeded.401 Unauthorized— missing or invalid key, or its owner left the organization.403 Forbidden— the key's owner is amemberof the organization, not anadmin.404 Not Found— no such resource, or it belongs to another organization. The API never confirms that an id exists to a caller who has no right to it.429 Too Many Requests— over 120 requests in a minute for this key.
Response fields
| Field | Type | Description |
|---|---|---|
success | boolean | Indicates if the operation was successful |
data.id | string | Unique identifier for the campaign |
data.name | string | Its internal name |
data.subject | string | The subject recipients see |
data.status | string | draft, scheduled, sending, sent, failed |
data.listId | string | The list it targets |
data.tagId | string | null |
data.segmentId | string | null |
data.scheduledAt | string | null |
data.sentAt | string | null |
data.createdAt | string | ISO creation date |
data.updatedAt | string | ISO date of the last change |
Example response
json
{
"success": true,
"data": {
"id": "4d19c0a2",
"name": "Newsletter",
"subject": "August news",
"status": "subscribed",
"listId": "0b7c51e8",
"tagId": "7c2ef4b1",
"segmentId": "3f81aa2c",
"scheduledAt": "2026-08-23T10:22:05.000Z",
"sentAt": "2026-08-23T10:22:05.000Z",
"createdAt": "2026-08-23T10:22:05.000Z",
"updatedAt": "2026-08-23T10:22:05.000Z"
}
}