---
title: "Create an automation"
description: "Makes a draft from a `definition`, from a `starter`, or an empty one when you send neither, and returns the whole automation. Nothing runs until you publish it."
url: "https://openemail.uk/docs/api/automations/create"
area: "API"
category: "Mailbox"
---

# Create an automation

Makes a draft from a `definition`, from a `starter`, or an empty one when you send neither, and returns the whole automation. Nothing runs until you publish it.

`POST /automations`

## POST /automations

Makes a draft from a `definition`, from a `starter`, or an empty one when you send neither, and returns the whole automation. Nothing runs until you publish it.

## Example

Needs `automations:write`.

**curl**

```
curl -X POST "$OE/automations" -H "$AUTH" -H 'content-type: application/json' -d '{
  "name": "Welcome series",
  "starter": "welcome-series",
  "settings": { "timezone": "Europe/London" }
}'
```

**Response**

```
{
  "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": "news@acme.com", "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": "news@acme.com", "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 may be unfinished. Whatever is missing comes back in `problems`, and only publishing insists on a complete definition.

> A definition that breaks the structure itself, such as two steps with one key or a step reached from two places, is refused with 422 `invalid_automation`.

> `settings` takes any subset of the settings, and the rest keep their defaults. `timezone` defaults to `UTC`.

> A workspace holds 100 automations by default. The next one is refused with 422 `workspace_limit_reached`.

## Reference

- [`POST /automations`](https://openemail.uk/docs/api/reference/automations#post-automations): full reference
