| name | yes | Internal campaign name (not shown to recipients, max 200 chars) |
| subject | yes | Email subject line (max 500 chars) |
| fromName | yes | Sender display name (max 200 chars) |
| fromEmail | yes | Sender email address — must match verified domain setup |
| siteId | no | Site UUID to associate the campaign with; null for org-level |
| replyTo | no | Reply-to address; null clears |
| previewText | no | Inbox preview snippet (max 500 chars) |
| htmlContent | no | Full HTML body. Reference images with canonical /api/media/… paths from Site media docs — not signed displayUrl values. Share grants are applied at dashboard send time; this API cannot trigger a send. |
| textContent | no | Plain-text alternative; omit to derive from htmlContent on create and whenever htmlContent changes on PATCH. Supply textContent to keep a custom plain-text version. |
| styleJson | no | Editor style settings applied to HTML blocks: fonts, brand color, maxWidth, bodyAlign (left|center), outerBackground (white|light|dark), containerBorder, hideBranding, imageRadius, buttonRadius |
| footerNotice | no | Compliance footer below the unsubscribe link (max 2000 chars) |
| senderContact | no | Physical mailing address or contact info in footer (max 500 chars) |
| unsubscribeLabel | no | Unsubscribe link label (max 200 chars; defaults to Unsubscribe) |