curl --request POST \
--url http://localhost:8080/actions \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"api_endpoint": "<string>",
"payload": {
"base_url": "<string>",
"path": "<string>",
"method": "<string>",
"operationId": "<string>",
"summary": "<string>",
"description": "<string>",
"parameters": [
{
"name": "<string>",
"description": "<string>",
"required": true,
"value": "<string>",
"schema": {}
}
],
"responses": {}
},
"description": "<string>",
"operation_id": "<string>",
"pinned": true,
"tags": [
"<string>"
],
"require_form_submission": true,
"restricted_to_segments": [
"<string>"
]
}
'import requests
url = "http://localhost:8080/actions"
payload = {
"name": "<string>",
"api_endpoint": "<string>",
"payload": {
"base_url": "<string>",
"path": "<string>",
"method": "<string>",
"operationId": "<string>",
"summary": "<string>",
"description": "<string>",
"parameters": [
{
"name": "<string>",
"description": "<string>",
"required": True,
"value": "<string>",
"schema": {}
}
],
"responses": {}
},
"description": "<string>",
"operation_id": "<string>",
"pinned": True,
"tags": ["<string>"],
"require_form_submission": True,
"restricted_to_segments": ["<string>"]
}
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: '<string>',
api_endpoint: '<string>',
payload: {
base_url: '<string>',
path: '<string>',
method: '<string>',
operationId: '<string>',
summary: '<string>',
description: '<string>',
parameters: [
{
name: '<string>',
description: '<string>',
required: true,
value: '<string>',
schema: {}
}
],
responses: {}
},
description: '<string>',
operation_id: '<string>',
pinned: true,
tags: ['<string>'],
require_form_submission: true,
restricted_to_segments: ['<string>']
})
};
fetch('http://localhost:8080/actions', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_PORT => "8080",
CURLOPT_URL => "http://localhost:8080/actions",
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' => '<string>',
'api_endpoint' => '<string>',
'payload' => [
'base_url' => '<string>',
'path' => '<string>',
'method' => '<string>',
'operationId' => '<string>',
'summary' => '<string>',
'description' => '<string>',
'parameters' => [
[
'name' => '<string>',
'description' => '<string>',
'required' => true,
'value' => '<string>',
'schema' => [
]
]
],
'responses' => [
]
],
'description' => '<string>',
'operation_id' => '<string>',
'pinned' => true,
'tags' => [
'<string>'
],
'require_form_submission' => true,
'restricted_to_segments' => [
'<string>'
]
]),
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 := "http://localhost:8080/actions"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"api_endpoint\": \"<string>\",\n \"payload\": {\n \"base_url\": \"<string>\",\n \"path\": \"<string>\",\n \"method\": \"<string>\",\n \"operationId\": \"<string>\",\n \"summary\": \"<string>\",\n \"description\": \"<string>\",\n \"parameters\": [\n {\n \"name\": \"<string>\",\n \"description\": \"<string>\",\n \"required\": true,\n \"value\": \"<string>\",\n \"schema\": {}\n }\n ],\n \"responses\": {}\n },\n \"description\": \"<string>\",\n \"operation_id\": \"<string>\",\n \"pinned\": true,\n \"tags\": [\n \"<string>\"\n ],\n \"require_form_submission\": true,\n \"restricted_to_segments\": [\n \"<string>\"\n ]\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("http://localhost:8080/actions")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"api_endpoint\": \"<string>\",\n \"payload\": {\n \"base_url\": \"<string>\",\n \"path\": \"<string>\",\n \"method\": \"<string>\",\n \"operationId\": \"<string>\",\n \"summary\": \"<string>\",\n \"description\": \"<string>\",\n \"parameters\": [\n {\n \"name\": \"<string>\",\n \"description\": \"<string>\",\n \"required\": true,\n \"value\": \"<string>\",\n \"schema\": {}\n }\n ],\n \"responses\": {}\n },\n \"description\": \"<string>\",\n \"operation_id\": \"<string>\",\n \"pinned\": true,\n \"tags\": [\n \"<string>\"\n ],\n \"require_form_submission\": true,\n \"restricted_to_segments\": [\n \"<string>\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("http://localhost:8080/actions")
http = Net::HTTP.new(url.host, url.port)
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"<string>\",\n \"api_endpoint\": \"<string>\",\n \"payload\": {\n \"base_url\": \"<string>\",\n \"path\": \"<string>\",\n \"method\": \"<string>\",\n \"operationId\": \"<string>\",\n \"summary\": \"<string>\",\n \"description\": \"<string>\",\n \"parameters\": [\n {\n \"name\": \"<string>\",\n \"description\": \"<string>\",\n \"required\": true,\n \"value\": \"<string>\",\n \"schema\": {}\n }\n ],\n \"responses\": {}\n },\n \"description\": \"<string>\",\n \"operation_id\": \"<string>\",\n \"pinned\": true,\n \"tags\": [\n \"<string>\"\n ],\n \"require_form_submission\": true,\n \"restricted_to_segments\": [\n \"<string>\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"id": "<string>",
"name": "<string>",
"description": "<string>",
"api_endpoint": "<string>",
"request_type": "<string>",
"operation_id": "<string>",
"payload": {
"base_url": "<string>",
"path": "<string>",
"method": "<string>",
"operationId": "<string>",
"summary": "<string>",
"description": "<string>",
"parameters": [
{
"name": "<string>",
"in": "query",
"description": "<string>",
"required": true,
"value": "<string>",
"schema": {}
}
],
"requestBody": {
"content": {},
"description": "<string>",
"required": true
},
"responses": {}
},
"status": "<string>",
"pinned": true,
"tags": [
"<string>"
],
"enabled_on_channel": {
"channels": [
"web"
]
},
"is_handoff_like": true,
"require_form_submission": true,
"restricted_to_segments": [
"<string>"
],
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z"
}{
"statusCode": 123,
"message": "<string>",
"error": "<string>"
}Create an action
Create actions your AI agent can call during sessions. Configure endpoints, dynamic inputs, and fixed parameter values through the API.
curl --request POST \
--url http://localhost:8080/actions \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"api_endpoint": "<string>",
"payload": {
"base_url": "<string>",
"path": "<string>",
"method": "<string>",
"operationId": "<string>",
"summary": "<string>",
"description": "<string>",
"parameters": [
{
"name": "<string>",
"description": "<string>",
"required": true,
"value": "<string>",
"schema": {}
}
],
"responses": {}
},
"description": "<string>",
"operation_id": "<string>",
"pinned": true,
"tags": [
"<string>"
],
"require_form_submission": true,
"restricted_to_segments": [
"<string>"
]
}
'import requests
url = "http://localhost:8080/actions"
payload = {
"name": "<string>",
"api_endpoint": "<string>",
"payload": {
"base_url": "<string>",
"path": "<string>",
"method": "<string>",
"operationId": "<string>",
"summary": "<string>",
"description": "<string>",
"parameters": [
{
"name": "<string>",
"description": "<string>",
"required": True,
"value": "<string>",
"schema": {}
}
],
"responses": {}
},
"description": "<string>",
"operation_id": "<string>",
"pinned": True,
"tags": ["<string>"],
"require_form_submission": True,
"restricted_to_segments": ["<string>"]
}
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: '<string>',
api_endpoint: '<string>',
payload: {
base_url: '<string>',
path: '<string>',
method: '<string>',
operationId: '<string>',
summary: '<string>',
description: '<string>',
parameters: [
{
name: '<string>',
description: '<string>',
required: true,
value: '<string>',
schema: {}
}
],
responses: {}
},
description: '<string>',
operation_id: '<string>',
pinned: true,
tags: ['<string>'],
require_form_submission: true,
restricted_to_segments: ['<string>']
})
};
fetch('http://localhost:8080/actions', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_PORT => "8080",
CURLOPT_URL => "http://localhost:8080/actions",
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' => '<string>',
'api_endpoint' => '<string>',
'payload' => [
'base_url' => '<string>',
'path' => '<string>',
'method' => '<string>',
'operationId' => '<string>',
'summary' => '<string>',
'description' => '<string>',
'parameters' => [
[
'name' => '<string>',
'description' => '<string>',
'required' => true,
'value' => '<string>',
'schema' => [
]
]
],
'responses' => [
]
],
'description' => '<string>',
'operation_id' => '<string>',
'pinned' => true,
'tags' => [
'<string>'
],
'require_form_submission' => true,
'restricted_to_segments' => [
'<string>'
]
]),
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 := "http://localhost:8080/actions"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"api_endpoint\": \"<string>\",\n \"payload\": {\n \"base_url\": \"<string>\",\n \"path\": \"<string>\",\n \"method\": \"<string>\",\n \"operationId\": \"<string>\",\n \"summary\": \"<string>\",\n \"description\": \"<string>\",\n \"parameters\": [\n {\n \"name\": \"<string>\",\n \"description\": \"<string>\",\n \"required\": true,\n \"value\": \"<string>\",\n \"schema\": {}\n }\n ],\n \"responses\": {}\n },\n \"description\": \"<string>\",\n \"operation_id\": \"<string>\",\n \"pinned\": true,\n \"tags\": [\n \"<string>\"\n ],\n \"require_form_submission\": true,\n \"restricted_to_segments\": [\n \"<string>\"\n ]\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("http://localhost:8080/actions")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"api_endpoint\": \"<string>\",\n \"payload\": {\n \"base_url\": \"<string>\",\n \"path\": \"<string>\",\n \"method\": \"<string>\",\n \"operationId\": \"<string>\",\n \"summary\": \"<string>\",\n \"description\": \"<string>\",\n \"parameters\": [\n {\n \"name\": \"<string>\",\n \"description\": \"<string>\",\n \"required\": true,\n \"value\": \"<string>\",\n \"schema\": {}\n }\n ],\n \"responses\": {}\n },\n \"description\": \"<string>\",\n \"operation_id\": \"<string>\",\n \"pinned\": true,\n \"tags\": [\n \"<string>\"\n ],\n \"require_form_submission\": true,\n \"restricted_to_segments\": [\n \"<string>\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("http://localhost:8080/actions")
http = Net::HTTP.new(url.host, url.port)
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"<string>\",\n \"api_endpoint\": \"<string>\",\n \"payload\": {\n \"base_url\": \"<string>\",\n \"path\": \"<string>\",\n \"method\": \"<string>\",\n \"operationId\": \"<string>\",\n \"summary\": \"<string>\",\n \"description\": \"<string>\",\n \"parameters\": [\n {\n \"name\": \"<string>\",\n \"description\": \"<string>\",\n \"required\": true,\n \"value\": \"<string>\",\n \"schema\": {}\n }\n ],\n \"responses\": {}\n },\n \"description\": \"<string>\",\n \"operation_id\": \"<string>\",\n \"pinned\": true,\n \"tags\": [\n \"<string>\"\n ],\n \"require_form_submission\": true,\n \"restricted_to_segments\": [\n \"<string>\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"id": "<string>",
"name": "<string>",
"description": "<string>",
"api_endpoint": "<string>",
"request_type": "<string>",
"operation_id": "<string>",
"payload": {
"base_url": "<string>",
"path": "<string>",
"method": "<string>",
"operationId": "<string>",
"summary": "<string>",
"description": "<string>",
"parameters": [
{
"name": "<string>",
"in": "query",
"description": "<string>",
"required": true,
"value": "<string>",
"schema": {}
}
],
"requestBody": {
"content": {},
"description": "<string>",
"required": true
},
"responses": {}
},
"status": "<string>",
"pinned": true,
"tags": [
"<string>"
],
"enabled_on_channel": {
"channels": [
"web"
]
},
"is_handoff_like": true,
"require_form_submission": true,
"restricted_to_segments": [
"<string>"
],
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z"
}{
"statusCode": 123,
"message": "<string>",
"error": "<string>"
}payload.parameters[].value to a non-empty string to supply a fixed query or path parameter on every call. Omit value or set it to null when the parameter should be filled at call time. A schema.example only illustrates an input; it does not supply a fixed value.
For example, an account identifier can stay fixed while the order reference varies:
{
"parameters": [
{
"name": "accountId",
"in": "query",
"required": true,
"value": "account-123",
"schema": { "type": "string" }
},
{
"name": "orderId",
"in": "path",
"required": true,
"value": null,
"schema": { "type": "string" }
}
]
}
payload alongside the action’s path and method. See Build an action for dashboard setup.Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Body
Action display name
The full API endpoint URL to call
HTTP method
GET, POST, PUT, PATCH, DELETE OpenAPI-style operation spec: parameters, requestBody, responses, etc.
Show child attributes
Show child attributes
What this action does
Unique operation ID (auto-generated from name if omitted). 1-64 characters of [a-zA-Z0-9_-]: it is the tool name the AI agent calls, and phone agents reject anything else.
^[a-zA-Z0-9_-]{1,64}$Channel restrictions (defaults to web only)
Show child attributes
Show child attributes
Whether to pin this action prominently
Tags for organizing actions
Require the user to submit a form before executing
Contact segment ids this action is restricted to. Empty/omit = available to all contacts. Segment ids come from list contact segments.
Response
Default Response
Unique action ID
Action display name
What this action does
The API endpoint URL this action calls
HTTP method (GET, POST, PUT, PATCH, DELETE)
Unique operation ID used to reference this action
OpenAPI-style operation spec defining parameters, request body, and responses
Show child attributes
Show child attributes
Action status (e.g. "live")
Whether this action is pinned prominently
Tags for organizing actions
Channel restrictions
Show child attributes
Show child attributes
Whether this action behaves like a handoff to a human agent
Whether a form must be submitted before the action executes
Contact segment ids this action is restricted to. Empty = available to all contacts.
When the action was created
When the action was last updated
Was this page helpful?