curl --request GET \
--url https://api.doozy.live/v1/tracks/{trackId} \
--header 'x-api-key: <api-key>'import requests
url = "https://api.doozy.live/v1/tracks/{trackId}"
headers = {"x-api-key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'x-api-key': '<api-key>'}};
fetch('https://api.doozy.live/v1/tracks/{trackId}', 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.doozy.live/v1/tracks/{trackId}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"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"
"net/http"
"io"
)
func main() {
url := "https://api.doozy.live/v1/tracks/{trackId}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-api-key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.doozy.live/v1/tracks/{trackId}")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.doozy.live/v1/tracks/{trackId}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["x-api-key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"object": "track",
"id": "wf_abc123",
"name": "New Hire Onboarding",
"description": "30-day onboarding journey for new employees",
"state": "active",
"trigger_type": "user_join",
"published_version": 3,
"current_draft_id": "wf-abc123-draft-7f2",
"step_count": 8,
"allow_self_join": true,
"created_at": "2026-01-15T10:30:00.000Z",
"updated_at": "2026-01-20T14:00:00.000Z",
"meta": {
"permissions": {
"can_view_results": true,
"can_clone": true,
"can_manage": true,
"can_edit": true,
"can_pause": true,
"can_resume": true,
"can_delete": true,
"can_activate": true,
"can_manage_admins": true
}
},
"trigger": {
"type": "user_join",
"filters": {
"groups": null,
"countries": null,
"manager_status": null,
"work_locations": null
}
},
"steps": [
{
"object": "step",
"id": "step_abc123",
"title": "Welcome Message",
"order": 1,
"day": 0,
"time": "09:00",
"type": "message",
"destination": {
"type": "user"
},
"message": "Welcome to the team!",
"post_as": {
"type": "doozy"
},
"description": "Sends a welcome message to the new hire",
"attachments": []
}
],
"steps_converted": false,
"catch_up": true,
"working_hours": {
"days_of_week": [
"monday"
],
"start_time": "<string>",
"end_time": "<string>",
"time_zone": "<string>"
},
"metrics": {
"object": "track_metrics",
"users_added_last_30_days": 25,
"users_added_all_time": 145,
"active_users": 30,
"delivered_users": 15,
"completed_users": 100
},
"admin_users": [
"user_abc123"
],
"result_visibility": {
"managers_can_view": true
},
"last_published_at": "2026-06-10T09:48:36.000Z",
"last_published_by": {
"user_id": "user_abc123",
"display_name": "John Doe",
"email": "john@example.com",
"slack_user_id": "U1234567890",
"image_token": "img_abc123",
"image_url": {
"image_24": "<string>",
"image_32": "<string>",
"image_48": "<string>",
"image_72": "<string>",
"image_192": "<string>",
"image_512": "<string>",
"image_1024": "<string>",
"image_original": "<string>"
}
},
"draft_has_unpublished_changes": true,
"draft_last_edited_at": "2026-06-10T10:15:00.000Z",
"draft_last_edited_by": {
"user_id": "user_abc123",
"display_name": "John Doe",
"email": "john@example.com",
"slack_user_id": "U1234567890",
"image_token": "img_abc123",
"image_url": {
"image_24": "<string>",
"image_32": "<string>",
"image_48": "<string>",
"image_72": "<string>",
"image_192": "<string>",
"image_512": "<string>",
"image_1024": "<string>",
"image_original": "<string>"
}
},
"cohort_usage": {
"definition_id": "<string>",
"definition_name": "<string>",
"active_or_upcoming_cohort_count": 123
}
}{
"error": {
"type": "invalid_request_error",
"code": "resource_not_found",
"message": "No such quiz: quiz_abc123",
"param": "id",
"doc_url": "https://docs.doozy.live/api/errors#resource_not_found"
}
}{
"error": {
"type": "invalid_request_error",
"code": "resource_not_found",
"message": "No such quiz: quiz_abc123",
"param": "id",
"doc_url": "https://docs.doozy.live/api/errors#resource_not_found"
}
}{
"error": {
"type": "invalid_request_error",
"code": "resource_not_found",
"message": "No such quiz: quiz_abc123",
"param": "id",
"doc_url": "https://docs.doozy.live/api/errors#resource_not_found"
}
}{
"error": {
"type": "invalid_request_error",
"code": "resource_not_found",
"message": "No such quiz: quiz_abc123",
"param": "id",
"doc_url": "https://docs.doozy.live/api/errors#resource_not_found"
}
}Get track details
Retrieve a specific track by ID, including step summaries and enrollment metrics. Only accessible if the user is an admin of the track.
curl --request GET \
--url https://api.doozy.live/v1/tracks/{trackId} \
--header 'x-api-key: <api-key>'import requests
url = "https://api.doozy.live/v1/tracks/{trackId}"
headers = {"x-api-key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'x-api-key': '<api-key>'}};
fetch('https://api.doozy.live/v1/tracks/{trackId}', 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.doozy.live/v1/tracks/{trackId}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"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"
"net/http"
"io"
)
func main() {
url := "https://api.doozy.live/v1/tracks/{trackId}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-api-key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.doozy.live/v1/tracks/{trackId}")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.doozy.live/v1/tracks/{trackId}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["x-api-key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"object": "track",
"id": "wf_abc123",
"name": "New Hire Onboarding",
"description": "30-day onboarding journey for new employees",
"state": "active",
"trigger_type": "user_join",
"published_version": 3,
"current_draft_id": "wf-abc123-draft-7f2",
"step_count": 8,
"allow_self_join": true,
"created_at": "2026-01-15T10:30:00.000Z",
"updated_at": "2026-01-20T14:00:00.000Z",
"meta": {
"permissions": {
"can_view_results": true,
"can_clone": true,
"can_manage": true,
"can_edit": true,
"can_pause": true,
"can_resume": true,
"can_delete": true,
"can_activate": true,
"can_manage_admins": true
}
},
"trigger": {
"type": "user_join",
"filters": {
"groups": null,
"countries": null,
"manager_status": null,
"work_locations": null
}
},
"steps": [
{
"object": "step",
"id": "step_abc123",
"title": "Welcome Message",
"order": 1,
"day": 0,
"time": "09:00",
"type": "message",
"destination": {
"type": "user"
},
"message": "Welcome to the team!",
"post_as": {
"type": "doozy"
},
"description": "Sends a welcome message to the new hire",
"attachments": []
}
],
"steps_converted": false,
"catch_up": true,
"working_hours": {
"days_of_week": [
"monday"
],
"start_time": "<string>",
"end_time": "<string>",
"time_zone": "<string>"
},
"metrics": {
"object": "track_metrics",
"users_added_last_30_days": 25,
"users_added_all_time": 145,
"active_users": 30,
"delivered_users": 15,
"completed_users": 100
},
"admin_users": [
"user_abc123"
],
"result_visibility": {
"managers_can_view": true
},
"last_published_at": "2026-06-10T09:48:36.000Z",
"last_published_by": {
"user_id": "user_abc123",
"display_name": "John Doe",
"email": "john@example.com",
"slack_user_id": "U1234567890",
"image_token": "img_abc123",
"image_url": {
"image_24": "<string>",
"image_32": "<string>",
"image_48": "<string>",
"image_72": "<string>",
"image_192": "<string>",
"image_512": "<string>",
"image_1024": "<string>",
"image_original": "<string>"
}
},
"draft_has_unpublished_changes": true,
"draft_last_edited_at": "2026-06-10T10:15:00.000Z",
"draft_last_edited_by": {
"user_id": "user_abc123",
"display_name": "John Doe",
"email": "john@example.com",
"slack_user_id": "U1234567890",
"image_token": "img_abc123",
"image_url": {
"image_24": "<string>",
"image_32": "<string>",
"image_48": "<string>",
"image_72": "<string>",
"image_192": "<string>",
"image_512": "<string>",
"image_1024": "<string>",
"image_original": "<string>"
}
},
"cohort_usage": {
"definition_id": "<string>",
"definition_name": "<string>",
"active_or_upcoming_cohort_count": 123
}
}{
"error": {
"type": "invalid_request_error",
"code": "resource_not_found",
"message": "No such quiz: quiz_abc123",
"param": "id",
"doc_url": "https://docs.doozy.live/api/errors#resource_not_found"
}
}{
"error": {
"type": "invalid_request_error",
"code": "resource_not_found",
"message": "No such quiz: quiz_abc123",
"param": "id",
"doc_url": "https://docs.doozy.live/api/errors#resource_not_found"
}
}{
"error": {
"type": "invalid_request_error",
"code": "resource_not_found",
"message": "No such quiz: quiz_abc123",
"param": "id",
"doc_url": "https://docs.doozy.live/api/errors#resource_not_found"
}
}{
"error": {
"type": "invalid_request_error",
"code": "resource_not_found",
"message": "No such quiz: quiz_abc123",
"param": "id",
"doc_url": "https://docs.doozy.live/api/errors#resource_not_found"
}
}Authorizations
API key for authentication. Generate keys in the Doozy dashboard.
Path Parameters
The unique identifier of the track
1 - 128^[A-Za-z0-9_-]+$"wf_abc123"
Response
Track details with steps and metrics
Object type identifier
track "track"
Unique track identifier
"wf_abc123"
Track name
"New Hire Onboarding"
Track description
"30-day onboarding journey for new employees"
Current state of the track
draft, active, paused, archived "active"
How users are added to the track
user_join, manual_user_trigger, schedule, work_anniversary, added_by_another_workflow, self_join, cohort_started, cohort_member_added "user_join"
Monotonic version number, incremented on each publish. 0 before the first publish (a never-published eager draft, which clients open directly in the editor rather than the detail page).
x >= 03
Active collaborative draft id, or null for legacy tracks created before the collaborative editor rollout.
"wf-abc123-draft-7f2"
Number of steps in the track
8
Whether users can self-enroll in the track
true
When the track was created (ISO 8601 format)
"2026-01-15T10:30:00.000Z"
When the track was last updated (ISO 8601 format)
"2026-01-20T14:00:00.000Z"
What the requesting user can do with this track (edit, pause, resume, delete, activate, manage admins). Use these to drive UI affordances.
Show child attributes
Show child attributes
Full trigger configuration for the track
- Option 1
- Option 2
- Option 3
- Option 4
- Option 5
- Option 6
- Option 7
- Option 8
Show child attributes
Show child attributes
Steps in the track
- Option 1
- Option 2
- Option 3
- Option 4
- Option 5
- Option 6
- Option 7
- Option 8
- Option 9
- Option 10
Show child attributes
Show child attributes
True when the returned steps were converted on read from legacy wait-based timing to the day-anchored model. The stored track is untouched until it is saved again; the editor uses this to show its upgrade notice.
false
Catch-up: when a member reaches the Track after a step's send time has passed, true (default) makes overdue steps eligible in order, subject to working hours; false shifts Day 1 to the next working day. Nothing is skipped.
true
Working hours for the Track. null means the Track inherits the workspace policy. New enrollments snapshot the resolved policy.
Show child attributes
Show child attributes
Enrollment and completion metrics
Show child attributes
Show child attributes
List of Doozy user IDs who are admins of this track
["user_abc123"]
Who can see this track's results in the People view. Null = owner only. Set via the result-visibility endpoint.
Show child attributes
Show child attributes
ISO 8601 timestamp of the most recent publish, or null if never published.
"2026-06-10T09:48:36.000Z"
Profile of the person who last published, or null.
Show child attributes
Show child attributes
True when the current draft has edits that diverge from the published track.
true
ISO 8601 timestamp of the last edit to the current draft, or null.
"2026-06-10T10:15:00.000Z"
Profile of the last person to edit the current draft, or null.
Show child attributes
Show child attributes
Set when this track is attached to a cohort program (its trigger is a cohort trigger); null otherwise. Used to warn before archiving a track a cohort depends on.
Show child attributes
Show child attributes
Was this page helpful?