curl --request GET \
--url https://api.doozy.live/v1/tracks \
--header 'x-api-key: <api-key>'import requests
url = "https://api.doozy.live/v1/tracks"
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', 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",
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"
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")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.doozy.live/v1/tracks")
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": "list",
"data": [
{
"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
}
},
"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": []
}
]
}
],
"has_more": true,
"url": "/v1/tracks",
"next_cursor": "wf_xyz789",
"previous_cursor": "wf_abc123"
}{
"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"
}
}List tracks
List all tracks accessible to the authenticated user. Returns tracks where the user is an admin. Results are paginated and sorted by creation date (newest first). By default, archived tracks are excluded.
curl --request GET \
--url https://api.doozy.live/v1/tracks \
--header 'x-api-key: <api-key>'import requests
url = "https://api.doozy.live/v1/tracks"
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', 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",
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"
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")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.doozy.live/v1/tracks")
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": "list",
"data": [
{
"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
}
},
"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": []
}
]
}
],
"has_more": true,
"url": "/v1/tracks",
"next_cursor": "wf_xyz789",
"previous_cursor": "wf_abc123"
}{
"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.
Query Parameters
Maximum number of results to return (1-100, default 25)
1 <= x <= 10025
Cursor for pagination - the ID of the last item from the previous page
256"wf_abc123"
Filter tracks by state
draft, active, paused, archived "active"
Filter tracks by trigger type
user_join, manual_user_trigger, schedule, work_anniversary, added_by_another_workflow, self_join, cohort_started, cohort_member_added "user_join"
Comma-separated list of fields to expand in the response. Use 'steps' to include step details.
steps "steps"
Response
List of tracks
String representing the object type
list "list"
Array of track objects
Show child attributes
Show child attributes
Whether there are more results available beyond this page
true
The URL for accessing this list endpoint
"/v1/tracks"
Cursor to fetch the next page of results. Pass as starting_after in subsequent requests.
"wf_xyz789"
Cursor to fetch the previous page of results. Pass as ending_before in subsequent requests.
"wf_abc123"
Was this page helpful?