curl --request POST \
--url https://your-instance.example.com/api/automations \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "Follow-up after 24h",
"description": "Send a follow-up SMS if the lead has not replied in 24h.",
"event": "message.received",
"actions": {
"sendMessage": [
{
"template": "follow-up-24h",
"channel": "sms"
}
]
},
"sourceStatuses": [
"New lead"
],
"triggerType": "status_change",
"triggerLogicType": "timer",
"timerLogic": {
"enabled": true,
"delay": 24,
"unit": "hours"
},
"schedule": {
"start": "09:00",
"end": "18:00"
},
"maxFollowUpCount": 3
}
'import requests
url = "https://your-instance.example.com/api/automations"
payload = {
"name": "Follow-up after 24h",
"description": "Send a follow-up SMS if the lead has not replied in 24h.",
"event": "message.received",
"actions": { "sendMessage": [
{
"template": "follow-up-24h",
"channel": "sms"
}
] },
"sourceStatuses": ["New lead"],
"triggerType": "status_change",
"triggerLogicType": "timer",
"timerLogic": {
"enabled": True,
"delay": 24,
"unit": "hours"
},
"schedule": {
"start": "09:00",
"end": "18:00"
},
"maxFollowUpCount": 3
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: 'Follow-up after 24h',
description: 'Send a follow-up SMS if the lead has not replied in 24h.',
event: 'message.received',
actions: {sendMessage: [{template: 'follow-up-24h', channel: 'sms'}]},
sourceStatuses: ['New lead'],
triggerType: 'status_change',
triggerLogicType: 'timer',
timerLogic: {enabled: true, delay: 24, unit: 'hours'},
schedule: {start: '09:00', end: '18:00'},
maxFollowUpCount: 3
})
};
fetch('https://your-instance.example.com/api/automations', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://your-instance.example.com/api/automations",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'name' => 'Follow-up after 24h',
'description' => 'Send a follow-up SMS if the lead has not replied in 24h.',
'event' => 'message.received',
'actions' => [
'sendMessage' => [
[
'template' => 'follow-up-24h',
'channel' => 'sms'
]
]
],
'sourceStatuses' => [
'New lead'
],
'triggerType' => 'status_change',
'triggerLogicType' => 'timer',
'timerLogic' => [
'enabled' => true,
'delay' => 24,
'unit' => 'hours'
],
'schedule' => [
'start' => '09:00',
'end' => '18:00'
],
'maxFollowUpCount' => 3
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://your-instance.example.com/api/automations"
payload := strings.NewReader("{\n \"name\": \"Follow-up after 24h\",\n \"description\": \"Send a follow-up SMS if the lead has not replied in 24h.\",\n \"event\": \"message.received\",\n \"actions\": {\n \"sendMessage\": [\n {\n \"template\": \"follow-up-24h\",\n \"channel\": \"sms\"\n }\n ]\n },\n \"sourceStatuses\": [\n \"New lead\"\n ],\n \"triggerType\": \"status_change\",\n \"triggerLogicType\": \"timer\",\n \"timerLogic\": {\n \"enabled\": true,\n \"delay\": 24,\n \"unit\": \"hours\"\n },\n \"schedule\": {\n \"start\": \"09:00\",\n \"end\": \"18:00\"\n },\n \"maxFollowUpCount\": 3\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://your-instance.example.com/api/automations")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"Follow-up after 24h\",\n \"description\": \"Send a follow-up SMS if the lead has not replied in 24h.\",\n \"event\": \"message.received\",\n \"actions\": {\n \"sendMessage\": [\n {\n \"template\": \"follow-up-24h\",\n \"channel\": \"sms\"\n }\n ]\n },\n \"sourceStatuses\": [\n \"New lead\"\n ],\n \"triggerType\": \"status_change\",\n \"triggerLogicType\": \"timer\",\n \"timerLogic\": {\n \"enabled\": true,\n \"delay\": 24,\n \"unit\": \"hours\"\n },\n \"schedule\": {\n \"start\": \"09:00\",\n \"end\": \"18:00\"\n },\n \"maxFollowUpCount\": 3\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://your-instance.example.com/api/automations")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"Follow-up after 24h\",\n \"description\": \"Send a follow-up SMS if the lead has not replied in 24h.\",\n \"event\": \"message.received\",\n \"actions\": {\n \"sendMessage\": [\n {\n \"template\": \"follow-up-24h\",\n \"channel\": \"sms\"\n }\n ]\n },\n \"sourceStatuses\": [\n \"New lead\"\n ],\n \"triggerType\": \"status_change\",\n \"triggerLogicType\": \"timer\",\n \"timerLogic\": {\n \"enabled\": true,\n \"delay\": 24,\n \"unit\": \"hours\"\n },\n \"schedule\": {\n \"start\": \"09:00\",\n \"end\": \"18:00\"\n },\n \"maxFollowUpCount\": 3\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"message": "Automation created successfully",
"data": {
"_id": "64d2f9c5e8a1d4e001a0b1c2",
"name": "Follow-up after 24h",
"description": "Send a follow-up SMS if the lead has not replied in 24h.",
"triggerLogicType": "timer",
"enabled": false
}
}{
"success": false,
"message": "Automation not found"
}{
"success": false,
"message": "Automation not found"
}Create a new automation
Creates a new Automation owned by the caller user and organization. The trigger logic (event vs timer), conditions, schedule and actions are all configurable. The enabled field in the body sets the calling user’s per-automation preference at creation time (defaults to true); it does NOT set a global enabled flag on the Automation itself, and other users start with no preference until they call PATCH //preference.
curl --request POST \
--url https://your-instance.example.com/api/automations \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "Follow-up after 24h",
"description": "Send a follow-up SMS if the lead has not replied in 24h.",
"event": "message.received",
"actions": {
"sendMessage": [
{
"template": "follow-up-24h",
"channel": "sms"
}
]
},
"sourceStatuses": [
"New lead"
],
"triggerType": "status_change",
"triggerLogicType": "timer",
"timerLogic": {
"enabled": true,
"delay": 24,
"unit": "hours"
},
"schedule": {
"start": "09:00",
"end": "18:00"
},
"maxFollowUpCount": 3
}
'import requests
url = "https://your-instance.example.com/api/automations"
payload = {
"name": "Follow-up after 24h",
"description": "Send a follow-up SMS if the lead has not replied in 24h.",
"event": "message.received",
"actions": { "sendMessage": [
{
"template": "follow-up-24h",
"channel": "sms"
}
] },
"sourceStatuses": ["New lead"],
"triggerType": "status_change",
"triggerLogicType": "timer",
"timerLogic": {
"enabled": True,
"delay": 24,
"unit": "hours"
},
"schedule": {
"start": "09:00",
"end": "18:00"
},
"maxFollowUpCount": 3
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: 'Follow-up after 24h',
description: 'Send a follow-up SMS if the lead has not replied in 24h.',
event: 'message.received',
actions: {sendMessage: [{template: 'follow-up-24h', channel: 'sms'}]},
sourceStatuses: ['New lead'],
triggerType: 'status_change',
triggerLogicType: 'timer',
timerLogic: {enabled: true, delay: 24, unit: 'hours'},
schedule: {start: '09:00', end: '18:00'},
maxFollowUpCount: 3
})
};
fetch('https://your-instance.example.com/api/automations', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://your-instance.example.com/api/automations",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'name' => 'Follow-up after 24h',
'description' => 'Send a follow-up SMS if the lead has not replied in 24h.',
'event' => 'message.received',
'actions' => [
'sendMessage' => [
[
'template' => 'follow-up-24h',
'channel' => 'sms'
]
]
],
'sourceStatuses' => [
'New lead'
],
'triggerType' => 'status_change',
'triggerLogicType' => 'timer',
'timerLogic' => [
'enabled' => true,
'delay' => 24,
'unit' => 'hours'
],
'schedule' => [
'start' => '09:00',
'end' => '18:00'
],
'maxFollowUpCount' => 3
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://your-instance.example.com/api/automations"
payload := strings.NewReader("{\n \"name\": \"Follow-up after 24h\",\n \"description\": \"Send a follow-up SMS if the lead has not replied in 24h.\",\n \"event\": \"message.received\",\n \"actions\": {\n \"sendMessage\": [\n {\n \"template\": \"follow-up-24h\",\n \"channel\": \"sms\"\n }\n ]\n },\n \"sourceStatuses\": [\n \"New lead\"\n ],\n \"triggerType\": \"status_change\",\n \"triggerLogicType\": \"timer\",\n \"timerLogic\": {\n \"enabled\": true,\n \"delay\": 24,\n \"unit\": \"hours\"\n },\n \"schedule\": {\n \"start\": \"09:00\",\n \"end\": \"18:00\"\n },\n \"maxFollowUpCount\": 3\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://your-instance.example.com/api/automations")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"Follow-up after 24h\",\n \"description\": \"Send a follow-up SMS if the lead has not replied in 24h.\",\n \"event\": \"message.received\",\n \"actions\": {\n \"sendMessage\": [\n {\n \"template\": \"follow-up-24h\",\n \"channel\": \"sms\"\n }\n ]\n },\n \"sourceStatuses\": [\n \"New lead\"\n ],\n \"triggerType\": \"status_change\",\n \"triggerLogicType\": \"timer\",\n \"timerLogic\": {\n \"enabled\": true,\n \"delay\": 24,\n \"unit\": \"hours\"\n },\n \"schedule\": {\n \"start\": \"09:00\",\n \"end\": \"18:00\"\n },\n \"maxFollowUpCount\": 3\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://your-instance.example.com/api/automations")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"Follow-up after 24h\",\n \"description\": \"Send a follow-up SMS if the lead has not replied in 24h.\",\n \"event\": \"message.received\",\n \"actions\": {\n \"sendMessage\": [\n {\n \"template\": \"follow-up-24h\",\n \"channel\": \"sms\"\n }\n ]\n },\n \"sourceStatuses\": [\n \"New lead\"\n ],\n \"triggerType\": \"status_change\",\n \"triggerLogicType\": \"timer\",\n \"timerLogic\": {\n \"enabled\": true,\n \"delay\": 24,\n \"unit\": \"hours\"\n },\n \"schedule\": {\n \"start\": \"09:00\",\n \"end\": \"18:00\"\n },\n \"maxFollowUpCount\": 3\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"message": "Automation created successfully",
"data": {
"_id": "64d2f9c5e8a1d4e001a0b1c2",
"name": "Follow-up after 24h",
"description": "Send a follow-up SMS if the lead has not replied in 24h.",
"triggerLogicType": "timer",
"enabled": false
}
}{
"success": false,
"message": "Automation not found"
}{
"success": false,
"message": "Automation not found"
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Body
Sets the calling user's per-automation preference (stored on User.automations[id]). Defaults to true when omitted. Does NOT set a global flag on the Automation; other users see no preference until they call PATCH /{id}/preference.
Either "event" or "timer"
Show child attributes
Show child attributes
Show child attributes
Show child attributes
x >= 1Response
Automation created successfully
Returned by POST /api/automations and PUT /api/automations/{id} — wraps the created/updated AutomationDocument plus a status message.
true An Automation document with two derived per-user fields: enabled (from User.automations[id]) and userSmsNotification (per-user SMS settings).
Show child attributes
Show child attributes
{ "_id": "64d2f9c5e8a1d4e001a0b1c2", "name": "Follow-up after 24h", "description": "Send a follow-up SMS if the lead has not replied in 24h.", "organizationId": "64a1b2c3d4e5f60012345678", "userId": "64a1b2c3d4e5f60012345679", "event": "message.received", "actions": { "sendMessage": [ { "template": "follow-up-24h", "channel": "sms" } ] }, "sourceStatuses": ["New lead"], "maxTransitions": 3, "triggerType": "status_change", "conditions": [ { "field": "lastInboundDirection", "op": "eq", "value": "inbound" } ], "triggerLogicType": "timer", "timerLogic": { "enabled": true, "delay": 24, "unit": "hours" }, "schedule": { "start": "09:00", "end": "18:00" }, "maxFollowUpCount": 3, "enabled": true, "userSmsNotification": { "enabled": true, "phoneNumbers": ["+14155551234"], "message": "New lead pending follow-up." }, "createdAt": "2026-04-12T14:22:10.000Z", "updatedAt": "2026-04-22T10:14:00.000Z" }