Update Journey Status
curl --request PUT \
--url https://api.tracklysms.com/api/v2/journeys/{journey_id}/status \
--header 'Content-Type: application/json' \
--header 'X-Api-Key: <api-key>' \
--data '
{
"status": "<string>"
}
'import requests
url = "https://api.tracklysms.com/api/v2/journeys/{journey_id}/status"
payload = { "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({status: '<string>'})
};
fetch('https://api.tracklysms.com/api/v2/journeys/{journey_id}/status', 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}/status",
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([
'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}/status"
payload := strings.NewReader("{\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}/status")
.header("X-Api-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"status\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.tracklysms.com/api/v2/journeys/{journey_id}/status")
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 \"status\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"message": "Journey status updated to active",
"journey": {
"id": "664f1a2b3c4d5e6f7a8b9c0d",
"name": "Welcome",
"priority": 0,
"triggerSummary": "No trigger",
"stepCount": 1,
"enrolledCount": 0,
"completedCount": 0,
"status": "active",
"pauseReason": null,
"createdAt": "2026-09-21T10:00:00",
"updatedAt": "2026-09-21T10:00:00"
}
}
Journeys (v2)
Update Journey Status
Activate, pause, draft, or archive an SMS welcome journey.
PUT
/
v2
/
journeys
/
{journey_id}
/
status
Update Journey Status
curl --request PUT \
--url https://api.tracklysms.com/api/v2/journeys/{journey_id}/status \
--header 'Content-Type: application/json' \
--header 'X-Api-Key: <api-key>' \
--data '
{
"status": "<string>"
}
'import requests
url = "https://api.tracklysms.com/api/v2/journeys/{journey_id}/status"
payload = { "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({status: '<string>'})
};
fetch('https://api.tracklysms.com/api/v2/journeys/{journey_id}/status', 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}/status",
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([
'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}/status"
payload := strings.NewReader("{\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}/status")
.header("X-Api-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"status\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.tracklysms.com/api/v2/journeys/{journey_id}/status")
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 \"status\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"message": "Journey status updated to active",
"journey": {
"id": "664f1a2b3c4d5e6f7a8b9c0d",
"name": "Welcome",
"priority": 0,
"triggerSummary": "No trigger",
"stepCount": 1,
"enrolledCount": 0,
"completedCount": 0,
"status": "active",
"pauseReason": null,
"createdAt": "2026-09-21T10:00:00",
"updatedAt": "2026-09-21T10:00:00"
}
}
Changes the journey status, clears the pause reason, and updates holds on active enrollments. Draft and paused statuses hold active enrollments; active and archived statuses release existing holds. An archived journey sends nothing, and its released enrollments exit permanently as they come due; a later status change does not restore them. Draft and paused hold the enrollments before the new status is stored, while active and archived store the status before releasing them, so a request that fails partway can only delay sends, never leave a stopped journey still sending.
Declares the
Activation requires a nonempty steps array and a start step, and rechecks referenced double opt-in configurations. Invalid status or activation requirements return 400; missing or foreign journeys return 404.
For activation errors and ambiguous outcomes, follow the write retry rules.
journeys.write scope. Authenticate with X-Api-Key; see Authentication.
Activation follows the API key requirements. Restricted keys retain the three stop statuses. Extra body fields are ignored by this endpoint.
Parameters
string
required
Journey ID returned by create or list. Use a valid journey ID; malformed IDs currently return an unexpected error.
string
required
One of draft, active, paused, or archived.
Response
The compact journey object containsid, name, priority, triggerSummary, stepCount, enrolledCount, completedCount, status, pauseReason, createdAt, and updatedAt. It omits the account ID, trigger definition, and steps. Use Get Journey for the full definition.
{
"success": true,
"message": "Journey status updated to active",
"journey": {
"id": "664f1a2b3c4d5e6f7a8b9c0d",
"name": "Welcome",
"priority": 0,
"triggerSummary": "No trigger",
"stepCount": 1,
"enrolledCount": 0,
"completedCount": 0,
"status": "active",
"pauseReason": null,
"createdAt": "2026-09-21T10:00:00",
"updatedAt": "2026-09-21T10:00:00"
}
}