curl --request PUT \
--url https://your-instance.example.com/api/automations/{id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"description": "Updated copy and slightly longer delay.",
"timerLogic": {
"enabled": true,
"delay": 36,
"unit": "hours"
},
"maxFollowUpCount": 4
}
'import requests
url = "https://your-instance.example.com/api/automations/{id}"
payload = {
"description": "Updated copy and slightly longer delay.",
"timerLogic": {
"enabled": True,
"delay": 36,
"unit": "hours"
},
"maxFollowUpCount": 4
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
description: 'Updated copy and slightly longer delay.',
timerLogic: {enabled: true, delay: 36, unit: 'hours'},
maxFollowUpCount: 4
})
};
fetch('https://your-instance.example.com/api/automations/{id}', 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/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'description' => 'Updated copy and slightly longer delay.',
'timerLogic' => [
'enabled' => true,
'delay' => 36,
'unit' => 'hours'
],
'maxFollowUpCount' => 4
]),
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/{id}"
payload := strings.NewReader("{\n \"description\": \"Updated copy and slightly longer delay.\",\n \"timerLogic\": {\n \"enabled\": true,\n \"delay\": 36,\n \"unit\": \"hours\"\n },\n \"maxFollowUpCount\": 4\n}")
req, _ := http.NewRequest("PUT", 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.put("https://your-instance.example.com/api/automations/{id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"description\": \"Updated copy and slightly longer delay.\",\n \"timerLogic\": {\n \"enabled\": true,\n \"delay\": 36,\n \"unit\": \"hours\"\n },\n \"maxFollowUpCount\": 4\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://your-instance.example.com/api/automations/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"description\": \"Updated copy and slightly longer delay.\",\n \"timerLogic\": {\n \"enabled\": true,\n \"delay\": 36,\n \"unit\": \"hours\"\n },\n \"maxFollowUpCount\": 4\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"
}{
"success": false,
"message": "Automation not found"
}Update an existing automation
Updates editable fields on an Automation owned by the caller. Schedule, timerLogic, conditions, and actions are replaced wholesale when provided; omit fields to leave them unchanged.
curl --request PUT \
--url https://your-instance.example.com/api/automations/{id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"description": "Updated copy and slightly longer delay.",
"timerLogic": {
"enabled": true,
"delay": 36,
"unit": "hours"
},
"maxFollowUpCount": 4
}
'import requests
url = "https://your-instance.example.com/api/automations/{id}"
payload = {
"description": "Updated copy and slightly longer delay.",
"timerLogic": {
"enabled": True,
"delay": 36,
"unit": "hours"
},
"maxFollowUpCount": 4
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
description: 'Updated copy and slightly longer delay.',
timerLogic: {enabled: true, delay: 36, unit: 'hours'},
maxFollowUpCount: 4
})
};
fetch('https://your-instance.example.com/api/automations/{id}', 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/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'description' => 'Updated copy and slightly longer delay.',
'timerLogic' => [
'enabled' => true,
'delay' => 36,
'unit' => 'hours'
],
'maxFollowUpCount' => 4
]),
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/{id}"
payload := strings.NewReader("{\n \"description\": \"Updated copy and slightly longer delay.\",\n \"timerLogic\": {\n \"enabled\": true,\n \"delay\": 36,\n \"unit\": \"hours\"\n },\n \"maxFollowUpCount\": 4\n}")
req, _ := http.NewRequest("PUT", 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.put("https://your-instance.example.com/api/automations/{id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"description\": \"Updated copy and slightly longer delay.\",\n \"timerLogic\": {\n \"enabled\": true,\n \"delay\": 36,\n \"unit\": \"hours\"\n },\n \"maxFollowUpCount\": 4\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://your-instance.example.com/api/automations/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"description\": \"Updated copy and slightly longer delay.\",\n \"timerLogic\": {\n \"enabled\": true,\n \"delay\": 36,\n \"unit\": \"hours\"\n },\n \"maxFollowUpCount\": 4\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"
}{
"success": false,
"message": "Automation not found"
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Path Parameters
Body
Updates the calling user's per-automation preference (User.automations[id]). Same semantics as on Create — does NOT toggle a global flag on the Automation. Use PATCH /{id}/preference if you only want to flip the preference without touching the rest of the automation.
Either "event" or "timer"
Show child attributes
Show child attributes
Show child attributes
Show child attributes
x >= 1Response
Automation updated 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"
}