Update Journey
curl --request PUT \
--url https://api.tracklysms.com/api/v2/journeys/{journey_id} \
--header 'Content-Type: application/json' \
--header 'X-Api-Key: <api-key>' \
--data '
{
"name": "<string>",
"trigger": {},
"priority": 123,
"steps": {},
"startStepId": "<string>",
"status": "<string>"
}
'import requests
url = "https://api.tracklysms.com/api/v2/journeys/{journey_id}"
payload = {
"name": "<string>",
"trigger": {},
"priority": 123,
"steps": {},
"startStepId": "<string>",
"status": "<string>"
}
headers = {
"X-Api-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {'X-Api-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: '<string>',
trigger: {},
priority: 123,
steps: {},
startStepId: '<string>',
status: '<string>'
})
};
fetch('https://api.tracklysms.com/api/v2/journeys/{journey_id}', 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://api.tracklysms.com/api/v2/journeys/{journey_id}",
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([
'name' => '<string>',
'trigger' => [
],
'priority' => 123,
'steps' => [
],
'startStepId' => '<string>',
'status' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-Api-Key: <api-key>"
],
]);
$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.tracklysms.com/api/v2/journeys/{journey_id}"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"trigger\": {},\n \"priority\": 123,\n \"steps\": {},\n \"startStepId\": \"<string>\",\n \"status\": \"<string>\"\n}")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("X-Api-Key", "<api-key>")
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.tracklysms.com/api/v2/journeys/{journey_id}")
.header("X-Api-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"trigger\": {},\n \"priority\": 123,\n \"steps\": {},\n \"startStepId\": \"<string>\",\n \"status\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.tracklysms.com/api/v2/journeys/{journey_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["X-Api-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"<string>\",\n \"trigger\": {},\n \"priority\": 123,\n \"steps\": {},\n \"startStepId\": \"<string>\",\n \"status\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"message": "Journey updated successfully",
"journey": {
"id": "664f1a2b3c4d5e6f7a8b9c0d",
"accountId": 101,
"name": "Updated welcome",
"trigger": {
"operator": "AND",
"conditions": [],
"groups": []
},
"priority": 0,
"steps": [
{
"stepId": "done",
"name": "Exit",
"stepType": "exit",
"config": {},
"nextStepId": null
}
],
"startStepId": "done",
"status": "draft",
"pauseReason": null,
"createdAt": "2026-09-21T10:00:00",
"updatedAt": "2026-09-21T10:00:00"
}
}
Journeys (v2)
Update Journey
Update an SMS welcome journey definition.
PUT
/
v2
/
journeys
/
{journey_id}
Update Journey
curl --request PUT \
--url https://api.tracklysms.com/api/v2/journeys/{journey_id} \
--header 'Content-Type: application/json' \
--header 'X-Api-Key: <api-key>' \
--data '
{
"name": "<string>",
"trigger": {},
"priority": 123,
"steps": {},
"startStepId": "<string>",
"status": "<string>"
}
'import requests
url = "https://api.tracklysms.com/api/v2/journeys/{journey_id}"
payload = {
"name": "<string>",
"trigger": {},
"priority": 123,
"steps": {},
"startStepId": "<string>",
"status": "<string>"
}
headers = {
"X-Api-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {'X-Api-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: '<string>',
trigger: {},
priority: 123,
steps: {},
startStepId: '<string>',
status: '<string>'
})
};
fetch('https://api.tracklysms.com/api/v2/journeys/{journey_id}', 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://api.tracklysms.com/api/v2/journeys/{journey_id}",
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([
'name' => '<string>',
'trigger' => [
],
'priority' => 123,
'steps' => [
],
'startStepId' => '<string>',
'status' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-Api-Key: <api-key>"
],
]);
$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.tracklysms.com/api/v2/journeys/{journey_id}"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"trigger\": {},\n \"priority\": 123,\n \"steps\": {},\n \"startStepId\": \"<string>\",\n \"status\": \"<string>\"\n}")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("X-Api-Key", "<api-key>")
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.tracklysms.com/api/v2/journeys/{journey_id}")
.header("X-Api-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"trigger\": {},\n \"priority\": 123,\n \"steps\": {},\n \"startStepId\": \"<string>\",\n \"status\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.tracklysms.com/api/v2/journeys/{journey_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["X-Api-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"<string>\",\n \"trigger\": {},\n \"priority\": 123,\n \"steps\": {},\n \"startStepId\": \"<string>\",\n \"status\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"message": "Journey updated successfully",
"journey": {
"id": "664f1a2b3c4d5e6f7a8b9c0d",
"accountId": 101,
"name": "Updated welcome",
"trigger": {
"operator": "AND",
"conditions": [],
"groups": []
},
"priority": 0,
"steps": [
{
"stepId": "done",
"name": "Exit",
"stepType": "exit",
"config": {},
"nextStepId": null
}
],
"startStepId": "done",
"status": "draft",
"pauseReason": null,
"createdAt": "2026-09-21T10:00:00",
"updatedAt": "2026-09-21T10:00:00"
}
}
Updates only the supplied fields. Send the complete replacement array when changing
Activation is checked against the result of the update, not the submitted fields: a journey that ends active must have a nonempty steps array and a start step contained in it. Update Journey Status applies the same checks to the stored journey.
Authoring may also return the policy, conflict, or availability errors documented under Create Journey.
steps. Status changes also update holds on active enrollments.
Declares the journeys.write scope. Authenticate with X-Api-Key; see Authentication.
Authoring follows the API key requirements and retry rules. Restricted keys may submit an exact status-only stop body; adding any other field makes the request an authoring operation.
Path Parameters
string
required
Journey ID returned by create or list. Use a valid journey ID; malformed IDs currently return an unexpected error.
Body Parameters
string
New nonempty journey name.
object
Replacement trigger group. An empty value resets the trigger to an empty AND group.
integer
New routing priority.
array of objects
Complete replacement step array, using the same format as create.
string
New starting step. If omitted, the existing value is retained. A nonempty replacement steps array must still contain that existing start step.
string
draft, active, paused, or archived. Any other value is rejected. Clears the pause reason and updates enrollment holds.
Response
Thejourney object uses camelCase: id, integer accountId, name, trigger, priority, steps, startStepId, status, pauseReason, createdAt, and updatedAt. The trigger can be null. Each step contains stepId, name, stepType, config, and nullable nextStepId. Pause reasons and absent timestamps can be null.
{
"success": true,
"message": "Journey updated successfully",
"journey": {
"id": "664f1a2b3c4d5e6f7a8b9c0d",
"accountId": 101,
"name": "Updated welcome",
"trigger": {
"operator": "AND",
"conditions": [],
"groups": []
},
"priority": 0,
"steps": [
{
"stepId": "done",
"name": "Exit",
"stepType": "exit",
"config": {},
"nextStepId": null
}
],
"startStepId": "done",
"status": "draft",
"pauseReason": null,
"createdAt": "2026-09-21T10:00:00",
"updatedAt": "2026-09-21T10:00:00"
}
}
Errors
| HTTP | Code | Meaning |
|---|---|---|
| 400 | May be absent | Request body is not a JSON object, name is not a string, or priority is not an integer; read error. |
| 400 | May be absent | Invalid name, trigger, steps, or routing; read error. |
| 400 | May be absent | status is not draft, active, paused, or archived; read error. |
| 400 | May be absent | The update leaves the journey active with no steps, or with no start step contained in the resulting steps; read error. |
| 404 | May be absent | The journey does not exist or belongs to another account. |