Update a flow's happy path
Updates the happy path’s title, persona, environment, brief or expectations. Omitted fields are left
alone; additionalExpectations replaces the set wholesale rather than appending.
Its persona and environment are what the edge cases inherit, so changing them here changes every edge case that does not name its own.
import Roark from '@roarkanalytics/sdk';
const client = new Roark({
bearerToken: process.env['ROARK_API_BEARER_TOKEN'], // This is the default and can be omitted
});
const response = await client.customerFlow.updateHappyPath('182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e');
console.log(response.data);import os
from roark_analytics import Roark
client = Roark(
bearer_token=os.environ.get("ROARK_API_BEARER_TOKEN"), # This is the default and can be omitted
)
response = client.customer_flow.update_happy_path(
flow_id="182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
)
print(response.data)curl --request PUT \
--url https://api.roark.ai/v1/customer-flow/{flowId}/happy-path \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"title": "<string>",
"environmentId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"prompt": "<string>",
"precededByCustomerFlowId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"precededByCustomerFlowVariantId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"personaOverrideId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"additionalExpectations": [
{
"prompt": "The agent confirmed the new appointment time back to the customer"
}
]
}
'<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.roark.ai/v1/customer-flow/{flowId}/happy-path",
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([
'title' => '<string>',
'environmentId' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'prompt' => '<string>',
'precededByCustomerFlowId' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'precededByCustomerFlowVariantId' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'personaOverrideId' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'additionalExpectations' => [
[
'prompt' => 'The agent confirmed the new appointment time back to the customer'
]
]
]),
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://api.roark.ai/v1/customer-flow/{flowId}/happy-path"
payload := strings.NewReader("{\n \"title\": \"<string>\",\n \"environmentId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"prompt\": \"<string>\",\n \"precededByCustomerFlowId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"precededByCustomerFlowVariantId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"personaOverrideId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"additionalExpectations\": [\n {\n \"prompt\": \"The agent confirmed the new appointment time back to the customer\"\n }\n ]\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://api.roark.ai/v1/customer-flow/{flowId}/happy-path")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"title\": \"<string>\",\n \"environmentId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"prompt\": \"<string>\",\n \"precededByCustomerFlowId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"precededByCustomerFlowVariantId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"personaOverrideId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"additionalExpectations\": [\n {\n \"prompt\": \"The agent confirmed the new appointment time back to the customer\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.roark.ai/v1/customer-flow/{flowId}/happy-path")
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 \"title\": \"<string>\",\n \"environmentId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"prompt\": \"<string>\",\n \"precededByCustomerFlowId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"precededByCustomerFlowVariantId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"personaOverrideId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"additionalExpectations\": [\n {\n \"prompt\": \"The agent confirmed the new appointment time back to the customer\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"data": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"title": "<string>",
"precededByCustomerFlowId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"precededByCustomerFlowVariantId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"isGenerated": false,
"createdAt": "<string>",
"updatedAt": "<string>",
"personaOverride": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"understoodLanguages": [],
"backgroundNoise": "NONE",
"speechPace": "NORMAL",
"speechClarity": "CLEAR",
"hasDisfluencies": false,
"baseEmotion": "NEUTRAL",
"intentClarity": "CLEAR",
"confirmationStyle": "EXPLICIT",
"memoryReliability": "HIGH",
"responseTiming": "NORMAL",
"idleMessages": [
"<string>"
],
"idleTimeoutSeconds": 10,
"idleMessageMaxSpokenCount": 3,
"idleMessageResetCountOnUserSpeechEnabled": true,
"properties": {
"age": 35,
"zipCode": "94105",
"occupation": "Software Engineer"
},
"createdAt": "<string>",
"updatedAt": "<string>",
"description": "<string>",
"secondaryLanguage": "EN",
"backstoryPrompt": "A busy professional calling during lunch break"
},
"environment": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"backgroundNoise": "NONE",
"createdAt": "<string>",
"updatedAt": "<string>",
"description": "<string>"
},
"additionalExpectations": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"prompt": "<string>"
}
],
"type": "<string>",
"steps": [
{
"type": "<string>",
"nodeId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"ref": "<string>",
"steps": "<array>",
"mergeIntoNodeIds": [
"<string>"
],
"content": "<string>"
}
]
}
}{
"type": "validation",
"code": "invalid_parameter",
"message": "The request was invalid",
"param": "email"
}{
"type": "authentication",
"code": "unauthorized",
"message": "Authentication required"
}{
"type": "forbidden",
"code": "permission_denied",
"message": "You do not have permission to access this resource"
}{
"type": "not_found",
"code": "resource_not_found",
"message": "The requested resource could not be found"
}{
"type": "rate_limit",
"code": "too_many_requests",
"message": "Rate limit exceeded"
}{
"type": "internal",
"code": "internal_error",
"message": "Internal server error"
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Path Parameters
Body
Fields to change on a variant. Omitted fields are left alone. Making a variant the default is a separate operation, since it also demotes the current default.
1The persona this runs as. Null on an edge case inherits the happy path's.
Replaces the expectations that apply to this variant on top of the flow's. Omit to leave them alone, send [] to clear. Improv flows only: a scripted variant's expectations come from the agent turns on its path and are rewritten on the next graph edit.
Show child attributes
Show child attributes
Response
The updated happy path
One way of running a customer flow.
- Scripted
- Improv
- Voicemail
Show child attributes
Show child attributes
import Roark from '@roarkanalytics/sdk';
const client = new Roark({
bearerToken: process.env['ROARK_API_BEARER_TOKEN'], // This is the default and can be omitted
});
const response = await client.customerFlow.updateHappyPath('182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e');
console.log(response.data);import os
from roark_analytics import Roark
client = Roark(
bearer_token=os.environ.get("ROARK_API_BEARER_TOKEN"), # This is the default and can be omitted
)
response = client.customer_flow.update_happy_path(
flow_id="182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
)
print(response.data)curl --request PUT \
--url https://api.roark.ai/v1/customer-flow/{flowId}/happy-path \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"title": "<string>",
"environmentId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"prompt": "<string>",
"precededByCustomerFlowId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"precededByCustomerFlowVariantId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"personaOverrideId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"additionalExpectations": [
{
"prompt": "The agent confirmed the new appointment time back to the customer"
}
]
}
'<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.roark.ai/v1/customer-flow/{flowId}/happy-path",
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([
'title' => '<string>',
'environmentId' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'prompt' => '<string>',
'precededByCustomerFlowId' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'precededByCustomerFlowVariantId' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'personaOverrideId' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'additionalExpectations' => [
[
'prompt' => 'The agent confirmed the new appointment time back to the customer'
]
]
]),
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://api.roark.ai/v1/customer-flow/{flowId}/happy-path"
payload := strings.NewReader("{\n \"title\": \"<string>\",\n \"environmentId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"prompt\": \"<string>\",\n \"precededByCustomerFlowId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"precededByCustomerFlowVariantId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"personaOverrideId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"additionalExpectations\": [\n {\n \"prompt\": \"The agent confirmed the new appointment time back to the customer\"\n }\n ]\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://api.roark.ai/v1/customer-flow/{flowId}/happy-path")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"title\": \"<string>\",\n \"environmentId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"prompt\": \"<string>\",\n \"precededByCustomerFlowId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"precededByCustomerFlowVariantId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"personaOverrideId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"additionalExpectations\": [\n {\n \"prompt\": \"The agent confirmed the new appointment time back to the customer\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.roark.ai/v1/customer-flow/{flowId}/happy-path")
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 \"title\": \"<string>\",\n \"environmentId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"prompt\": \"<string>\",\n \"precededByCustomerFlowId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"precededByCustomerFlowVariantId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"personaOverrideId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"additionalExpectations\": [\n {\n \"prompt\": \"The agent confirmed the new appointment time back to the customer\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"data": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"title": "<string>",
"precededByCustomerFlowId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"precededByCustomerFlowVariantId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"isGenerated": false,
"createdAt": "<string>",
"updatedAt": "<string>",
"personaOverride": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"understoodLanguages": [],
"backgroundNoise": "NONE",
"speechPace": "NORMAL",
"speechClarity": "CLEAR",
"hasDisfluencies": false,
"baseEmotion": "NEUTRAL",
"intentClarity": "CLEAR",
"confirmationStyle": "EXPLICIT",
"memoryReliability": "HIGH",
"responseTiming": "NORMAL",
"idleMessages": [
"<string>"
],
"idleTimeoutSeconds": 10,
"idleMessageMaxSpokenCount": 3,
"idleMessageResetCountOnUserSpeechEnabled": true,
"properties": {
"age": 35,
"zipCode": "94105",
"occupation": "Software Engineer"
},
"createdAt": "<string>",
"updatedAt": "<string>",
"description": "<string>",
"secondaryLanguage": "EN",
"backstoryPrompt": "A busy professional calling during lunch break"
},
"environment": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"backgroundNoise": "NONE",
"createdAt": "<string>",
"updatedAt": "<string>",
"description": "<string>"
},
"additionalExpectations": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"prompt": "<string>"
}
],
"type": "<string>",
"steps": [
{
"type": "<string>",
"nodeId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"ref": "<string>",
"steps": "<array>",
"mergeIntoNodeIds": [
"<string>"
],
"content": "<string>"
}
]
}
}{
"type": "validation",
"code": "invalid_parameter",
"message": "The request was invalid",
"param": "email"
}{
"type": "authentication",
"code": "unauthorized",
"message": "Authentication required"
}{
"type": "forbidden",
"code": "permission_denied",
"message": "You do not have permission to access this resource"
}{
"type": "not_found",
"code": "resource_not_found",
"message": "The requested resource could not be found"
}{
"type": "rate_limit",
"code": "too_many_requests",
"message": "Rate limit exceeded"
}{
"type": "internal",
"code": "internal_error",
"message": "Internal server error"
}