# Create Automation

> POST /automations — create an entire automation flow in a single request.

`POST /automations`

Creates an automation. The [trigger](https://www.sendping.co/docs/automations/trigger) is defined as the first item in the `steps` array with `type: "trigger"` (its `config.event_name` is the event that starts a run); a top-level `trigger` string is also accepted.

**Body parameters**

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `name` | string | Yes | The name of the automation. |
| `status` | string | No | The status of the automation. One of `enabled` or `disabled`. Defaults to `disabled`. Creating with `enabled` requires at least one step besides the trigger. |
| `domain` | string | Yes | The sending domain this automation belongs to (one of your domains, e.g. `yourdomain.com`). Only [events](https://www.sendping.co/docs/api/events-send) sent with the same `domain` trigger it. |
| `steps` | array | No | The [steps](https://www.sendping.co/docs/automations/steps) that compose the automation graph. Each step is `{ key, type, config }`; the first item with `type: "trigger"` defines the trigger. |
| `connections` | array | No | The [connections between steps](https://www.sendping.co/docs/automations/connections). Each is `{ from, to, type }`, where `from`/`to` are step keys and `type` is one of `default`, `condition_met`, `condition_not_met`, `event_received`, or `timeout`. Cyclic graphs are rejected. |
| `trigger` | string | No | Optional alternative to a trigger step — the event name that starts the automation, as a plain string. Custom event names cannot start with the reserved `sendping:` prefix; the built-in `sendping:schedule` scheduled trigger is the one exception. **Defaults to `contact.created`** (the built-in "contact added to audience" trigger) when you supply neither a top-level `trigger` nor a `type: "trigger"` step — so an automation created without a trigger is not inert: once enabled it enrolls every contact added to the domain pool. |
| `trigger_config` | object | No | Required when the trigger is `sendping:schedule` — the built-in scheduled trigger that runs the automation **once** for every contact in the domain’s audience at a set time. An object `{ at, timezone }`: `at` is an ISO 8601 instant that must be in the future and at most 366 days ahead; `timezone` is the IANA timezone name it was picked in (e.g. `America/New_York`). |

**Node.js**

```js
import { SendPing } from 'sendping';

const mb = new SendPing('mb_xxxxxxxxx');

const { data, error } = await mb.automations.create({
  "name": "Welcome series",
  "domain": "yourdomain.com",
  "steps": [
    {
      "key": "start",
      "type": "trigger",
      "config": { "event_name": "user.created" }
    },
    {
      "key": "welcome",
      "type": "send_email",
      "config": {
        "template": { "id": "34a080c9-b17d-4187-ad80-5af20266e535" }
      }
    }
  ],
  "connections": [
    { "from": "start", "to": "welcome" }
  ]
});
console.log({ data, error });
```

**Ruby**

```ruby
require "sendping"

SendPing.api_key = "mb_xxxxxxxxx"

SendPing::Automations.create({
  "name": "Welcome series",
  "domain": "yourdomain.com",
  "steps": [
    {
      "key": "start",
      "type": "trigger",
      "config": {
        "event_name": "user.created"
      }
    },
    {
      "key": "welcome",
      "type": "send_email",
      "config": {
        "template": {
          "id": "34a080c9-b17d-4187-ad80-5af20266e535"
        }
      }
    }
  ],
  "connections": [
    {
      "from": "start",
      "to": "welcome"
    }
  ]
})
```

**PHP**

```php
<?php
require 'vendor/autoload.php';

use SendPing\SendPing;

$sendping = SendPing::client('mb_xxxxxxxxx');

$sendping->automations->create([
  'name' => "Welcome series",
  'domain' => "yourdomain.com",
  'steps' => [
    [
      'key' => "start",
      'type' => "trigger",
      'config' => [
        'event_name' => "user.created"
      ]
    ],
    [
      'key' => "welcome",
      'type' => "send_email",
      'config' => [
        'template' => [
          'id' => "34a080c9-b17d-4187-ad80-5af20266e535"
        ]
      ]
    ]
  ],
  'connections' => [
    [
      'from' => "start",
      'to' => "welcome"
    ]
  ]
]);
```

**Python**

```python
import sendping

sendping.api_key = "mb_xxxxxxxxx"

sendping.Automations.create({
  "name": "Welcome series",
  "domain": "yourdomain.com",
  "steps": [
    {
      "key": "start",
      "type": "trigger",
      "config": {
        "event_name": "user.created"
      }
    },
    {
      "key": "welcome",
      "type": "send_email",
      "config": {
        "template": {
          "id": "34a080c9-b17d-4187-ad80-5af20266e535"
        }
      }
    }
  ],
  "connections": [
    {
      "from": "start",
      "to": "welcome"
    }
  ]
})
```

**Go**

```go
import "github.com/shekhu10/sendping-sdks/sendping-go"

client := sendping.NewClient("mb_xxxxxxxxx")

automation, err := client.Automations.Create(&sendping.CreateAutomationRequest{
    Name:   "Welcome series",
    Domain: "yourdomain.com",
    Steps: []sendping.AutomationStepInput{
        {
            Key:    "start",
            Type:   "trigger",
            Config: map[string]any{"event_name": "user.created"},
        },
        {
            Key:  "welcome",
            Type: "send_email",
            Config: map[string]any{
                "template": map[string]any{"id": "34a080c9-b17d-4187-ad80-5af20266e535"},
            },
        },
    },
    Connections: []sendping.AutomationConnectionInput{{From: "start", To: "welcome"}},
})
```

**Rust**

```rust
use sendping::{AutomationStepInput, ConnectionInput, CreateAutomationOptions, SendPing};

let mb = SendPing::new("mb_xxxxxxxxx");

let params = CreateAutomationOptions::new("Welcome series", "yourdomain.com")
    .with_step(AutomationStepInput::new("trigger")
        .with_key("start")
        .with_config(serde_json::json!({"event_name":"user.created"})))
    .with_step(AutomationStepInput::new("send_email")
        .with_key("welcome")
        .with_config(serde_json::json!({
            "template": {
                "id": "34a080c9-b17d-4187-ad80-5af20266e535"
            }
        })))
    .with_connection(ConnectionInput::new("start", "welcome"));
let _automation = mb.automations.create(params).await?;
```

**Java**

```java
import co.sendping.SendPing;
import co.sendping.SendPingResponse;
import co.sendping.requests.AutomationConnection;
import co.sendping.requests.AutomationStep;
import co.sendping.requests.CreateAutomationRequest;
import java.util.Map;

SendPing sendping = new SendPing("mb_xxxxxxxxx");

CreateAutomationRequest request = CreateAutomationRequest.builder()
        .name("Welcome series")
        .domain("yourdomain.com")
        .step(AutomationStep.builder()
                .key("start")
                .type("trigger")
                .config("event_name", "user.created")
                .build())
        .step(AutomationStep.builder()
                .key("welcome")
                .type("send_email")
                .config("template", Map.of("id", "34a080c9-b17d-4187-ad80-5af20266e535"))
                .build())
        .connection(AutomationConnection.of("start", "welcome"))
        .build();

SendPingResponse response = sendping.automations().create(request);
```

**.NET**

```csharp
using SendPing;

ISendPing sendping = SendPingClient.Create("mb_xxxxxxxxx");

var resp = await sendping.AutomationCreateAsync(new AutomationCreateOptions
{
    Name = "Welcome series",
    Domain = "yourdomain.com",
    Steps = new List<AutomationStepInput>
    {
        new()
        {
            Key = "start",
            Type = "trigger",
            Config = new Dictionary<string, object?>
            {
                ["event_name"] = "user.created",
            },
        },
        new()
        {
            Key = "welcome",
            Type = "send_email",
            Config = new Dictionary<string, object?>
            {
                ["template"] = new Dictionary<string, object?>
                {
                    ["id"] = "34a080c9-b17d-4187-ad80-5af20266e535",
                },
            },
        },
    },
    Connections = new List<AutomationConnection>
    {
        new() { From = "start", To = "welcome" },
    },
});
```

**cURL**

```bash
curl -X POST 'https://www.sendping.co/api/automations' \
  -H 'Authorization: Bearer mb_xxxxxxxxx' \
  -H 'Content-Type: application/json' \
  -d '{
  "name": "Welcome series",
  "domain": "yourdomain.com",
  "steps": [
    {
      "key": "start",
      "type": "trigger",
      "config": { "event_name": "user.created" }
    },
    {
      "key": "welcome",
      "type": "send_email",
      "config": {
        "template": { "id": "34a080c9-b17d-4187-ad80-5af20266e535" }
      }
    }
  ],
  "connections": [
    { "from": "start", "to": "welcome" }
  ]
}'
```

### Response

Returns the full automation object (HTTP 201). The first entry in `steps` is the trigger step (with its `key` preserved) and its `config` also carries the automation `domain`, followed by the executable steps. Every automation response also carries `trigger_key` (the `key` of the `type: "trigger"` step in your request, and `null` when the automation was created from a top-level `trigger` event name with no trigger step in `steps`) and `trigger_config` (`null` unless the trigger is `sendping:schedule`, in which case it holds `{ at, timezone }` and those fields are merged into the trigger step config too).

```json
{
  "object": "automation",
  "id": "c9b16d4f-ba6c-4e2e-b044-6bf4404e57fd",
  "audience_id": "78261eea-8f8b-4381-83c6-79fa7120f1cf",
  "domain": "yourdomain.com",
  "name": "Welcome series",
  "trigger": "user.created",
  "status": "disabled",
  "trigger_config": null,
  "trigger_key": "start",
  "steps": [
    {
      "key": "start",
      "type": "trigger",
      "config": { "event_name": "user.created", "domain": "yourdomain.com" }
    },
    {
      "id": "9a8b7c6d-5e4f-3a2b-1c0d-9e8f7a6b5c4d",
      "key": "welcome",
      "type": "send_email",
      "position": 0,
      "config": {
        "template": { "id": "34a080c9-b17d-4187-ad80-5af20266e535" }
      }
    }
  ],
  "connections": [
    { "from": "start", "to": "welcome", "type": "default" }
  ],
  "created_at": "2026-06-23T10:00:00.000Z",
  "updated_at": "2026-06-23T10:00:00.000Z"
}
```
