curl --request POST \
--url https://dally.ai/v1/automation.edit \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"rule_id": "3c1f0b7d-4a52-4e88-b6c3-1d7e9a204f61",
"message": "Here is the guide you asked for."
}
'import requests
url = "https://dally.ai/v1/automation.edit"
payload = {
"rule_id": "3c1f0b7d-4a52-4e88-b6c3-1d7e9a204f61",
"message": "Here is the guide you asked for."
}
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({
rule_id: '3c1f0b7d-4a52-4e88-b6c3-1d7e9a204f61',
message: 'Here is the guide you asked for.'
})
};
fetch('https://dally.ai/v1/automation.edit', 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://dally.ai/v1/automation.edit",
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([
'rule_id' => '3c1f0b7d-4a52-4e88-b6c3-1d7e9a204f61',
'message' => 'Here is the guide you asked for.'
]),
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://dally.ai/v1/automation.edit"
payload := strings.NewReader("{\n \"rule_id\": \"3c1f0b7d-4a52-4e88-b6c3-1d7e9a204f61\",\n \"message\": \"Here is the guide you asked for.\"\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://dally.ai/v1/automation.edit")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"rule_id\": \"3c1f0b7d-4a52-4e88-b6c3-1d7e9a204f61\",\n \"message\": \"Here is the guide you asked for.\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://dally.ai/v1/automation.edit")
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 \"rule_id\": \"3c1f0b7d-4a52-4e88-b6c3-1d7e9a204f61\",\n \"message\": \"Here is the guide you asked for.\"\n}"
response = http.request(request)
puts response.read_body{
"rule": {
"rule_id": "3c1f0b7d-4a52-4e88-b6c3-1d7e9a204f61",
"state": "proposed",
"surfaces": [
"comment",
"story_reply",
"dm"
],
"platform": "instagram",
"keywords": [
"pumpkin",
"recipe"
],
"message": "Here is the guide you asked for.",
"link_url": "https://dally.ai/",
"disclosure": "— automated reply",
"tracked_link": true,
"reply_preview": "Here is the guide you asked for.\nhttps://dally.ai/r/<click_id>\n\n— automated reply",
"reels": [],
"environment": "production",
"armed_at": null,
"disarmed_at": null,
"counts": {
"sends": 0,
"delivered": 0,
"reads": 0,
"click_throughs": 0,
"claims": 0,
"sign_ups": 0,
"invalid_traffic": 0,
"purchases": 0,
"revenue_cents": 0
},
"confirm": {
"operation": "automation.confirm",
"follow_up": "Arm the pumpkin rule"
},
"disarm": null
},
"show": {
"kind": "automation_board",
"data": {
"rule_id": "3c1f0b7d-4a52-4e88-b6c3-1d7e9a204f61"
}
},
"request_id": "req_01j8zkq"
}{
"error": {
"code": "invalid_request",
"message": "<string>",
"details": {}
},
"request_id": "<string>"
}automation.edit
Access: public. Send a JSON body; unknown keys are rejected with 400 invalid_request (inputs are strict). Responses may gain fields additively — never remove or repurpose; ignore unknown response fields.
curl --request POST \
--url https://dally.ai/v1/automation.edit \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"rule_id": "3c1f0b7d-4a52-4e88-b6c3-1d7e9a204f61",
"message": "Here is the guide you asked for."
}
'import requests
url = "https://dally.ai/v1/automation.edit"
payload = {
"rule_id": "3c1f0b7d-4a52-4e88-b6c3-1d7e9a204f61",
"message": "Here is the guide you asked for."
}
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({
rule_id: '3c1f0b7d-4a52-4e88-b6c3-1d7e9a204f61',
message: 'Here is the guide you asked for.'
})
};
fetch('https://dally.ai/v1/automation.edit', 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://dally.ai/v1/automation.edit",
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([
'rule_id' => '3c1f0b7d-4a52-4e88-b6c3-1d7e9a204f61',
'message' => 'Here is the guide you asked for.'
]),
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://dally.ai/v1/automation.edit"
payload := strings.NewReader("{\n \"rule_id\": \"3c1f0b7d-4a52-4e88-b6c3-1d7e9a204f61\",\n \"message\": \"Here is the guide you asked for.\"\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://dally.ai/v1/automation.edit")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"rule_id\": \"3c1f0b7d-4a52-4e88-b6c3-1d7e9a204f61\",\n \"message\": \"Here is the guide you asked for.\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://dally.ai/v1/automation.edit")
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 \"rule_id\": \"3c1f0b7d-4a52-4e88-b6c3-1d7e9a204f61\",\n \"message\": \"Here is the guide you asked for.\"\n}"
response = http.request(request)
puts response.read_body{
"rule": {
"rule_id": "3c1f0b7d-4a52-4e88-b6c3-1d7e9a204f61",
"state": "proposed",
"surfaces": [
"comment",
"story_reply",
"dm"
],
"platform": "instagram",
"keywords": [
"pumpkin",
"recipe"
],
"message": "Here is the guide you asked for.",
"link_url": "https://dally.ai/",
"disclosure": "— automated reply",
"tracked_link": true,
"reply_preview": "Here is the guide you asked for.\nhttps://dally.ai/r/<click_id>\n\n— automated reply",
"reels": [],
"environment": "production",
"armed_at": null,
"disarmed_at": null,
"counts": {
"sends": 0,
"delivered": 0,
"reads": 0,
"click_throughs": 0,
"claims": 0,
"sign_ups": 0,
"invalid_traffic": 0,
"purchases": 0,
"revenue_cents": 0
},
"confirm": {
"operation": "automation.confirm",
"follow_up": "Arm the pumpkin rule"
},
"disarm": null
},
"show": {
"kind": "automation_board",
"data": {
"rule_id": "3c1f0b7d-4a52-4e88-b6c3-1d7e9a204f61"
}
},
"request_id": "req_01j8zkq"
}{
"error": {
"code": "invalid_request",
"message": "<string>",
"details": {}
},
"request_id": "<string>"
}Authorizations
A WorkOS-dashboard-issued internal API key on Authorization: Bearer.
Body
The rule id automation.arm answered with; keyword_rules.rule_id.
^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$The words that fire the reply, one to ten, each one word; a trigger carrying any of them as a whole word, in any case, is answered. No word may answer twice on one surface while both rules are on. When the creator names no word, ask which one should fire it before proposing, offering the word the reel's caption calls for when it names one; never invent a word.
1 - 10 elements1 - 64^[^\s<>]+$The one line Dally sends as the creator, at most 800 Unicode code points; the link and the disclosure are added after it. When the creator gives no line, write one short line that offers what the reel promises and say it is yours; the board shows it and automation.edit changes it.
1 - 800Where the link lands; https only.
The posts a comment listens on and the stories a story reply listens on, from content.content_id; empty means any of the creator's. The creator's latest post is their newest content row by published_at. Ignored on the dm surface.
50^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$Which surfaces fire it, one to three: comment, story_reply, dm. Most creators name all three.
1 - 3 elementscomment: a comment on one of the automation's posts (reel, image or album), or on any of the creator's posts, answered in the commenter's DMs. story_reply: a reply to one of the automation's stories or highlights, or to any of the creator's stories, answered in that thread. dm: a DM carrying a keyword, answered in that thread.
comment, story_reply, dm true: the link is sent as dally.ai/r/, so taps, visits and sales are counted per person; false: the link is sent as typed and only sends and reads are counted
The whole set of follow-ups, replacing the ones the rule carries; an empty object drops them all.
Show child attributes
Show child attributes
Response
Success. request_id is present on every response.
One reply automation: its surfaces, its posts and stories or any of them, its keywords, the one line Dally sends as the creator with the link and the disclosure, where it stands, and its counts.
Show child attributes
Show child attributes
How it is shown: dally_write renders this kind on this very answer, so the creator already sees the board; do not render it again. The board reads the creator's automations itself and takes no rows from you.
Show child attributes
Show child attributes
Server-minted id for this request. Present on every response, success and error — quote it when reporting a problem.
1