Publish an automation
Freezes the draft as the next version and turns the automation on. People enter from this moment, and nobody who met the trigger earlier is added.
Runs the real call on your workspace.
POST /automations/{id}/publish
Freezes the draft as the next version and turns the automation on. People enter from this moment, and nobody who met the trigger earlier is added.
Example
Needs automations:write and emails:send.
curl -X POST "$OE/automations/aut_7c2e9a1f4b8d30c65e1a9f27/publish" -H "$AUTH"{ "object": "automation", "id": "aut_7c2e9a1f4b8d30c65e1a9f27", "name": "Welcome series", "description": null, "status": "live", "triggerKind": "audience_joined", "stepCount": 4, "emailCount": 2, "hasUnpublishedChanges": false, "publishedVersion": 2, "pausedReason": null, "lastError": null, "counts": { "active": 38, "completed": 412, "exited": 9 }, "createdBy": "q7Vd3kX9mT2pLw8RzN4bYc6HfJ1sGa5E", "publishedAt": "2026-10-02T09:14:00.000Z", "pausedAt": null, "archivedAt": null, "createdAt": "2026-10-01T16:40:12.000Z", "updatedAt": "2026-10-02T09:14:00.000Z", "definition": { "trigger": { "kind": "audience_joined", "audienceId": "aud_4c1b8e2a7d9f05c36b4e8a71", "includeImported": false }, "entry": "welcome", "steps": [ { "key": "welcome", "kind": "send_email", "next": "pause", "templateId": "tpl_9c1f0a4b7e05d3862c1f0a44", "templateVersion": null, "from": { "email": "[email protected]", "name": "Acme" }, "replyTo": null, "subject": null, "props": { "firstName": { "source": "contact", "field": "firstName" } } }, { "key": "pause", "kind": "wait", "next": "opened", "wait": { "mode": "duration", "amount": 3, "unit": "days" } }, { "key": "opened", "kind": "branch", "condition": { "kind": "email_opened", "stepKey": "welcome" }, "yes": null, "no": "nudge" }, { "key": "nudge", "kind": "send_email", "next": null, "templateId": "tpl_8f3a1c2e9b7d4a60", "templateVersion": null, "from": { "email": "[email protected]", "name": "Acme" }, "replyTo": null, "subject": "{{firstName|Hello}}, did you see this?", "props": {} } ] }, "published": { "trigger": { "kind": "audience_joined", "…": "…" }, "entry": "welcome", "steps": ["…"] }, "settings": { "timezone": "Europe/London", "sendWindow": { "days": [1, 2, 3, 4, 5], "startMinute": 540, "endMinute": 1020 }, "reentryDays": null, "exitOnLeave": true, "listAudienceId": null }, "problems": []}A draft with a blocking problem is refused with 422 invalid_automation, and the answer lists every problem in error.problems.
Every email step needs a published template with an unsubscribe link and a sender this key or app may send as. A template that cannot be filled in without a contact’s name is a problem too, because many contacts have no name: give the value a fallback.
Publishing when the plan’s live automations are all in use answers 403 automation_limit_reached.
Publishing an unchanged draft again makes no new version. It turns a paused automation back on.