curl --request POST \
--url https://dally.ai/v1/automation.arm \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"keywords": [
"pumpkin",
"recipe"
],
"message": "Here is the link you asked for."
}
'import requests
url = "https://dally.ai/v1/automation.arm"
payload = {
"keywords": ["pumpkin", "recipe"],
"message": "Here is the link 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({keywords: ['pumpkin', 'recipe'], message: 'Here is the link you asked for.'})
};
fetch('https://dally.ai/v1/automation.arm', 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.arm",
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([
'keywords' => [
'pumpkin',
'recipe'
],
'message' => 'Here is the link 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.arm"
payload := strings.NewReader("{\n \"keywords\": [\n \"pumpkin\",\n \"recipe\"\n ],\n \"message\": \"Here is the link 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.arm")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"keywords\": [\n \"pumpkin\",\n \"recipe\"\n ],\n \"message\": \"Here is the link you asked for.\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://dally.ai/v1/automation.arm")
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 \"keywords\": [\n \"pumpkin\",\n \"recipe\"\n ],\n \"message\": \"Here is the link 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 link you asked for.",
"link_url": "https://dally.ai/",
"disclosure": "— automated reply",
"tracked_link": true,
"reply_preview": "Here is the link 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.arm
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.arm \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"keywords": [
"pumpkin",
"recipe"
],
"message": "Here is the link you asked for."
}
'import requests
url = "https://dally.ai/v1/automation.arm"
payload = {
"keywords": ["pumpkin", "recipe"],
"message": "Here is the link 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({keywords: ['pumpkin', 'recipe'], message: 'Here is the link you asked for.'})
};
fetch('https://dally.ai/v1/automation.arm', 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.arm",
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([
'keywords' => [
'pumpkin',
'recipe'
],
'message' => 'Here is the link 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.arm"
payload := strings.NewReader("{\n \"keywords\": [\n \"pumpkin\",\n \"recipe\"\n ],\n \"message\": \"Here is the link 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.arm")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"keywords\": [\n \"pumpkin\",\n \"recipe\"\n ],\n \"message\": \"Here is the link you asked for.\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://dally.ai/v1/automation.arm")
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 \"keywords\": [\n \"pumpkin\",\n \"recipe\"\n ],\n \"message\": \"Here is the link 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 link you asked for.",
"link_url": "https://dally.ai/",
"disclosure": "— automated reply",
"tracked_link": true,
"reply_preview": "Here is the link 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 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. Default: Dally's home page.
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. Default: all three. A creator's 'DM automation' names where the reply lands, always the DMs, not the surface that fires it.
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
One more message per later step the person takes — signed up, connected, purchased — each sent once in the same Instagram thread as the creator, and only while Instagram's reply window is still open; nothing is ever queued for later.
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