{"Status":true,"Message":"","Response":{"post":{"postuid":"4f9d5cf3-81f9-4628-8084-e2830d389c77","tenantuid":"d8b744fc-2e70-4089-bb80-dd1d08f6c7b2","projectuid":"fc6490ac-7527-4f49-b06e-46f701280e85","title":"Chat Actions","slug":"article/chat-actions","html":"\u003Cp\u003EActions let the AI agent look things up in your own systems while it answers, for example a price for a given number of users, or a signed-in customer\u0027s plan. Each action is a REST endpoint on your side. The AI decides when to call one, fills in the details from the conversation, and answers from the result.\u003C/p\u003E\u003Cp\u003EGo to \u003Cb\u003EInbox\u003C/b\u003E, then \u003Cb\u003EMessenger settings\u003C/b\u003E, then the \u003Cb\u003EActions\u003C/b\u003E tab.\u003C/p\u003E\u003Ch2 id=\u0022how_an_action_works\u0022\u003EHow an action works\u003C/h2\u003E\u003Col\u003E\u003Cli\u003EA visitor asks something an action can answer, such as \u003Ci\u003E\u0022What would 25,000 contacts cost?\u0022\u003C/i\u003E\u003C/li\u003E\u003Cli\u003EThe AI picks the action from its description and fills in the parameters from the conversation. If a required value is missing, it asks the visitor. It never guesses one.\u003C/li\u003E\u003Cli\u003EOur server calls your endpoint and passes the result back to the AI.\u003C/li\u003E\u003Cli\u003EThe AI answers from the result, following your instructions, and quotes figures exactly.\u003C/li\u003E\u003C/ol\u003E\u003Cp\u003ECalls are made from our server, not the visitor\u0027s browser, so header values such as API keys never reach visitors.\u003C/p\u003E\u003Ch2 id=\u0022add_an_action\u0022\u003EAdd an action\u003C/h2\u003E\u003Cp\u003EClick \u003Cb\u003EAdd an action\u003C/b\u003E, or \u003Cb\u003EStart from an example\u003C/b\u003E to begin with a sample pricing action. Your endpoint must use https and return JSON. Then fill in:\u003C/p\u003E\u003Ctable border=\u00221\u0022 style=\u0022border-collapse: collapse; width: 100%;\u0022\u003E\u003Cthead\u003E\u003Ctr\u003E\u003Cth\u003EField\u003C/th\u003E\u003Cth\u003EWhat to enter\u003C/th\u003E\u003C/tr\u003E\u003C/thead\u003E\u003Ctr\u003E\u003Ctd\u003EName the AI calls\u003C/td\u003E\u003Ctd\u003EA short name such as \u003Ccode\u003Eprice_contacts\u003C/code\u003E: lowercase letters, digits and \u003Ccode\u003E_\u003C/code\u003E\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd\u003EMethod\u003C/td\u003E\u003Ctd\u003E\u003Cb\u003EGET\u003C/b\u003E puts parameters in the query string. \u003Cb\u003EPOST\u003C/b\u003E sends them as a JSON body.\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd\u003EURL (https)\u003C/td\u003E\u003Ctd\u003EYour endpoint. \u003Ccode\u003E{name}\u003C/code\u003E in the URL is replaced by that parameter\u0027s value.\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd\u003EWhen should the AI use it, and what does it return?\u003C/td\u003E\u003Ctd\u003EThe AI decides from this. Say what the action answers and when to use it.\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd\u003EParameters\u003C/td\u003E\u003Ctd\u003EWhat the AI fills in: name, type (string, integer, number or boolean), required, min and max, and what it means. Up to 8.\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd\u003EHeaders\u003C/td\u003E\u003Ctd\u003EOptional, such as an API key. Tick \u003Cb\u003ESecret\u003C/b\u003E and the value is never shown again after saving. Up to 5.\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd\u003EResult path\u003C/td\u003E\u003Ctd\u003EThe part of the JSON the AI should see, such as \u003Ccode\u003EResponse.rate\u003C/code\u003E. Leave blank to pass the whole response.\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd\u003EHow the AI should use the result\u003C/td\u003E\u003Ctd\u003EUnits, caveats and next steps, such as \u003Ci\u003E\u0022total is USD per month\u0022\u003C/i\u003E.\u003C/td\u003E\u003C/tr\u003E\u003C/table\u003E\u003Cfigure\u003E\u003Cimg class=\u0022lazy-load\u0022 data-src=\u0022https://graffiti-auf7e6dwhxhcbwek.z03.azurefd.net/d8b744fc-2e70-4089-bb80-dd1d08f6c7b2/fc6490ac-7527-4f49-b06e-46f701280e85/images/bd72107a907c4c2c96224efc2700e4ca.png?v=-212744508\u0022 data-width=\u0022986\u0022 data-height=\u00221109\u0022 style=\u0022max-width: 100%;\u0022 alt=\u0022The Actions tab with a pricing action open, showing its name, method, URL, description, a contacts parameter, a secret Authorization header, result instructions and Try it, and a second collapsed action for signed-in customers\u0022/\u003E\u003Cfigcaption\u003EMessenger settings, Actions tab\u003C/figcaption\u003E\u003C/figure\u003E\u003Cp\u003EClick \u003Cb\u003ESave settings\u003C/b\u003E. Saved actions are collapsed to their name and description; click one to open it. Each action has an on/off switch, and one that\u0027s missing something it needs is marked \u003Cb\u003EIncomplete: the AI can\u0027t use it yet\u003C/b\u003E. You can have up to 20 actions.\u003C/p\u003E\u003Ch2 id=\u0022test_an_action\u0022\u003ETest an action\u003C/h2\u003E\u003Cp\u003EOpen an action, enter sample values under \u003Cb\u003ETry it\u003C/b\u003E, and click \u003Cb\u003ERun test\u003C/b\u003E. It calls your endpoint and shows exactly what the AI would be given. To see how the AI uses an action in an answer, ask a question on the \u003Cb\u003ETest\u003C/b\u003E tab. See \u003Ca href=\u0022/article/testing-the-chat-ai\u0022\u003ETesting the Chat AI\u003C/a\u003E.\u003C/p\u003E\u003Ch2 id=\u0022safety_rules\u0022\u003ESafety rules\u003C/h2\u003E\u003Cul\u003E\u003Cli\u003EOnly public https addresses can be called. Private, internal and cloud-metadata addresses are refused.\u003C/li\u003E\u003Cli\u003ERedirects aren\u0027t followed.\u003C/li\u003E\u003Cli\u003EEach call has an 8-second timeout and reads at most 256 KB.\u003C/li\u003E\u003Cli\u003EValues the AI fills in are checked against your parameter definitions before the call.\u003C/li\u003E\u003Cli\u003EThere are at most 3 rounds of calls per answer.\u003C/li\u003E\u003Cli\u003EIf a call fails, the AI says it couldn\u0027t get the information and offers a person. It never makes up a figure.\u003C/li\u003E\u003C/ul\u003E\u003Cp\u003EYour team sees each call, with its inputs and result, under the AI\u0027s answer in the inbox. Visitors never see it. See \u003Ca href=\u0022/article/using-the-chat-inbox\u0022\u003EUsing the Chat Inbox\u003C/a\u003E.\u003C/p\u003E\u003Ch2 id=\u0022example_pricing_lookups\u0022\u003EExample: pricing lookups\u003C/h2\u003E\u003Cp\u003EDailyStory uses two GET actions for pricing. Both have one required \u003Ccode\u003Equantity\u003C/code\u003E parameter (integer) and the \u003Cb\u003EResult path\u003C/b\u003E \u003Ccode\u003EResponse.rate\u003C/code\u003E:\u003C/p\u003E\u003Ctable border=\u00221\u0022 style=\u0022border-collapse: collapse; width: 100%;\u0022\u003E\u003Cthead\u003E\u003Ctr\u003E\u003Cth\u003EName\u003C/th\u003E\u003Cth\u003EURL\u003C/th\u003E\u003Cth\u003EWhen to use it\u003C/th\u003E\u003Cth\u003EHow to use the result\u003C/th\u003E\u003C/tr\u003E\u003C/thead\u003E\u003Ctr\u003E\u003Ctd\u003E\u003Ccode\u003Eprice_contacts\u003C/code\u003E\u003C/td\u003E\u003Ctd\u003E\u003Ccode\u003Ehttps://app.dailystory.com/license/rate/contacts\u003C/code\u003E\u003C/td\u003E\u003Ctd\u003EMonthly price of a DailyStory plan for a number of active contacts. Use when the customer asks what DailyStory costs for their list size.\u003C/td\u003E\u003Ctd\u003E\u003Ccode\u003Etotal\u003C/code\u003E is USD per month; \u003Ccode\u003Equantity\u003C/code\u003E is the contact count actually priced (it rounds up to a pricing step; say so if it differs); \u003Ccode\u003Eincluded_email\u003C/code\u003E is monthly email sends included. Above 50,000 contacts the plan is Enterprise, so suggest talking to sales.\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd\u003E\u003Ccode\u003Eprice_sms\u003C/code\u003E\u003C/td\u003E\u003Ctd\u003E\u003Ccode\u003Ehttps://app.dailystory.com/license/rate/sms/credits\u003C/code\u003E\u003C/td\u003E\u003Ctd\u003EMonthly price of pre-purchased text message credits. Use when the customer asks what texting costs per month.\u003C/td\u003E\u003Ctd\u003E\u003Ccode\u003Etotal\u003C/code\u003E is USD per month for the credits; \u003Ccode\u003Eoverage_rate\u003C/code\u003E is USD per message beyond them.\u003C/td\u003E\u003C/tr\u003E\u003C/table\u003E\u003Cp\u003EAsked \u003Ci\u003E\u0022What would 25,000 contacts and 10,000 texts a month cost?\u0022\u003C/i\u003E, the AI calls both and answers \u003Ci\u003E\u0022$400 a month for 25,000 contacts (250,000 email sends included), $390 for 10,000 texts, $790 in total.\u0022\u003C/i\u003E Asked just \u003Ci\u003E\u0022How much does it cost?\u0022\u003C/i\u003E, it asks how many contacts first.\u003C/p\u003E\u003Ch2 id=\u0022actions_for_signedin_customers\u0022\u003EActions for signed-in customers\u003C/h2\u003E\u003Cp\u003EFor lookups about a customer\u0027s own account, such as \u003Ci\u003E\u0022What plan am I on?\u0022\u003C/i\u003E or \u003Ci\u003E\u0022When is my next invoice?\u0022\u003C/i\u003E, open the action and switch on \u003Cb\u003EOnly for signed-in customers, and send their user ID\u003C/b\u003E.\u003C/p\u003E\u003Cul\u003E\u003Cli\u003EThe action is offered to the AI only when the visitor is signed in and verified: your site passes \u003Ccode\u003Euser_id\u003C/code\u003E with a valid \u003Ccode\u003Euser_hash\u003C/code\u003E. Anonymous and unverified visitors never get it. See \u003Ca href=\u0022/article/chat-identity-verification\u0022\u003EChat Identity Verification\u003C/a\u003E.\u003C/li\u003E\u003Cli\u003ETheir user ID is sent under the name in \u003Cb\u003ESend the user ID as\u003C/b\u003E (default \u003Ccode\u003Euser_id\u003C/code\u003E): as \u003Ccode\u003E{user_id}\u003C/code\u003E in the URL if you put it there, otherwise in the query string (GET) or JSON body (POST).\u003C/li\u003E\u003Cli\u003EOur server fills in the verified ID. The AI never sees it and can\u0027t supply one, so a visitor can\u0027t get the AI to look up someone else\u0027s account.\u003C/li\u003E\u003Cli\u003ETo test one, enter a \u003Cb\u003EUser ID to test as\u003C/b\u003E next to \u003Cb\u003ERun test\u003C/b\u003E.\u003C/li\u003E\u003Cli\u003EThe \u003Cb\u003ETest\u003C/b\u003E tab runs as an anonymous visitor, so it never uses these actions.\u003C/li\u003E\u003C/ul\u003E\u003Ccite class=\u0022warning\u0022\u003E\u003Cspan class=\u0022title\u0022\u003ECall shutdown on sign-out\u003C/span\u003E\u003Cp\u003EWhen a customer signs out of your site, call the messenger\u0027s \u003Ccode\u003Eshutdown\u003C/code\u003E command. Otherwise the browser stays verified as them until the next sign-in. See \u003Ca href=\u0022/article/chat-messenger-javascript-api\u0022\u003EChat Messenger JavaScript API\u003C/a\u003E.\u003C/p\u003E\u003C/cite\u003E\u003Cp\u003ESee also \u003Ca href=\u0022/article/configuring-the-chat-ai-agent\u0022\u003EConfiguring the Chat AI Agent\u003C/a\u003E and \u003Ca href=\u0022/article/chat-question-rules\u0022\u003EChat Question Rules\u003C/a\u003E.\u003C/p\u003E","publish_status":0,"post_type":"Article","author":{},"featured_image_updating":false,"meta_description":"Learn how to add, configure, and test AI actions that call your REST endpoints securely for personalized customer responses and pricing lookups.","display_toc":true,"has_workingcopy":false,"allow_indexing":true,"total_views":2,"date_published":"2026-09-28T14:42:20.903","date_updated":"2026-09-28T15:34:54.36","date_created":"2026-09-28T14:41:57.09"}}}