curl --request GET \
--url https://api.hellotracks.com/v1/jobs \
--header 'API-Key: <api-key>'import requests
url = "https://api.hellotracks.com/v1/jobs"
headers = {"API-Key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'API-Key': '<api-key>'}};
fetch('https://api.hellotracks.com/v1/jobs', 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.hellotracks.com/v1/jobs",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"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.hellotracks.com/v1/jobs"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("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.hellotracks.com/v1/jobs")
.header("API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.hellotracks.com/v1/jobs")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["API-Key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"data": {
"items": [
{
"id": "650000000000000000000001",
"externalId": "ORDER-1001",
"title": "Install water heater",
"address": "500 Market St, San Francisco, CA 94105",
"notes": "Ring at the side door.",
"issueText": "",
"createdAt": 1793520000000,
"updatedAt": 1793523600000,
"scheduledAt": 0,
"assignedAt": 1793520000000,
"acceptedAt": 0,
"completedAt": 0,
"failedAt": 0,
"progress": "scheduled",
"date": "2026-11-02",
"priority": 2,
"timeWindow": {
"start": "09:00",
"end": "12:00"
},
"onSiteDurationSeconds": 3600,
"location": {
"lat": 37.7897,
"lng": -122.4
},
"assignee": {
"id": "a1b2c3",
"username": "alex@example.com",
"name": "Alex Rivera",
"email": "alex@example.com",
"phone": "+14155550101"
},
"placeId": "p1q2r3",
"contact": {
"name": "Sam Lee",
"phone": "+14155550102",
"email": "sam@example.com"
},
"customFields": {
"PO": "4711"
},
"linkedForms": [
{
"id": "f1a2b3",
"title": "Install checklist"
}
],
"etaSessionId": "eta_k7m2p9x4q8r3",
"etaUrl": "https://eta.page/K7M2-P9X4-Q8R3"
}
],
"totalCount": 1,
"hasMore": false
},
"error": null,
"meta": {
"path": "/v1/jobs",
"method": "GET"
}
}{
"data": null,
"error": {
"code": "invalid_request",
"message": "date must be YYYY-MM-DD"
},
"meta": {
"path": "/jobs",
"method": "GET"
}
}{
"data": null,
"error": {
"code": "invalid_api_key",
"message": "Invalid Hellotracks API key."
},
"meta": {
"path": "/jobs",
"method": "GET"
}
}{
"data": null,
"error": {
"code": "forbidden",
"message": "No permission."
},
"meta": {
"path": "/jobs",
"method": "GET"
}
}{
"data": null,
"error": {
"code": "throttled",
"message": "Too many requests."
},
"meta": {
"path": "/jobs",
"method": "GET"
}
}{
"data": null,
"error": {
"code": "internal_error",
"message": "Hellotracks API is temporarily unavailable."
},
"meta": {
"path": "/jobs",
"method": "GET"
}
}List jobs
Lists the company’s jobs.
Two modes:
- Day list (none of limit, skip, createdSince, updatedSince, progress): the jobs of one day,
dateor today in the caller’s time zone, ordered by route position, at most 5,000. Archived jobs only with includeArchived=true. - Paged list (any of limit, skip, createdSince, updatedSince, progress): all dates unless
dateis given, newest first (by last save, or by creation with createdSince),limitdefault 100, with totalCount and hasMore. Archived jobs are left out unless includeArchived=true.
Deleted jobs never come back. Looking up by id or externalId returns the job whatever its archive status and ignores date and assignee; no match gives an empty list.
Workers without the company setting workersViewJobCalendar may only list today (give or take four hours); other dates give 403.
curl --request GET \
--url https://api.hellotracks.com/v1/jobs \
--header 'API-Key: <api-key>'import requests
url = "https://api.hellotracks.com/v1/jobs"
headers = {"API-Key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'API-Key': '<api-key>'}};
fetch('https://api.hellotracks.com/v1/jobs', 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.hellotracks.com/v1/jobs",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"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.hellotracks.com/v1/jobs"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("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.hellotracks.com/v1/jobs")
.header("API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.hellotracks.com/v1/jobs")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["API-Key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"data": {
"items": [
{
"id": "650000000000000000000001",
"externalId": "ORDER-1001",
"title": "Install water heater",
"address": "500 Market St, San Francisco, CA 94105",
"notes": "Ring at the side door.",
"issueText": "",
"createdAt": 1793520000000,
"updatedAt": 1793523600000,
"scheduledAt": 0,
"assignedAt": 1793520000000,
"acceptedAt": 0,
"completedAt": 0,
"failedAt": 0,
"progress": "scheduled",
"date": "2026-11-02",
"priority": 2,
"timeWindow": {
"start": "09:00",
"end": "12:00"
},
"onSiteDurationSeconds": 3600,
"location": {
"lat": 37.7897,
"lng": -122.4
},
"assignee": {
"id": "a1b2c3",
"username": "alex@example.com",
"name": "Alex Rivera",
"email": "alex@example.com",
"phone": "+14155550101"
},
"placeId": "p1q2r3",
"contact": {
"name": "Sam Lee",
"phone": "+14155550102",
"email": "sam@example.com"
},
"customFields": {
"PO": "4711"
},
"linkedForms": [
{
"id": "f1a2b3",
"title": "Install checklist"
}
],
"etaSessionId": "eta_k7m2p9x4q8r3",
"etaUrl": "https://eta.page/K7M2-P9X4-Q8R3"
}
],
"totalCount": 1,
"hasMore": false
},
"error": null,
"meta": {
"path": "/v1/jobs",
"method": "GET"
}
}{
"data": null,
"error": {
"code": "invalid_request",
"message": "date must be YYYY-MM-DD"
},
"meta": {
"path": "/jobs",
"method": "GET"
}
}{
"data": null,
"error": {
"code": "invalid_api_key",
"message": "Invalid Hellotracks API key."
},
"meta": {
"path": "/jobs",
"method": "GET"
}
}{
"data": null,
"error": {
"code": "forbidden",
"message": "No permission."
},
"meta": {
"path": "/jobs",
"method": "GET"
}
}{
"data": null,
"error": {
"code": "throttled",
"message": "Too many requests."
},
"meta": {
"path": "/jobs",
"method": "GET"
}
}{
"data": null,
"error": {
"code": "internal_error",
"message": "Hellotracks API is temporarily unavailable."
},
"meta": {
"path": "/jobs",
"method": "GET"
}
}Authorizations
Your API key, from More → API & Integrations in the dashboard, or from ht signup / ht auth login.
Query Parameters
Only this job.
Only the job with this externalId. No match returns an empty list with totalCount 0.
Day of the jobs, YYYY-MM-DD. An empty value lists jobs without a date. Default: today in the day list, all dates in the paged list.
Search across all dates (used with text).
Only jobs of this member. An empty value lists unassigned jobs. Not together with assigneeUsername.
Only jobs of the member with this username. An empty value lists unassigned jobs. Not together with assigneeId.
Only jobs in this progress state. Switches to the paged list. Derived from the job's timestamps: success when completed, failed when marked failed, in_progress when accepted and checked in, accepted when accepted, unassigned when nobody is assigned, otherwise scheduled (assigned, not yet accepted).
unassigned, scheduled, accepted, in_progress, success, failed Case-insensitive search in title, address and notes; also matches a job id, an order number or a job group name.
ms timestamp: only jobs created at or after it, newest created first. Switches to the paged list.
ms timestamp: only jobs saved at or after it. Switches to the paged list.
Include archived jobs.
Page size of the paged list. Switches to the paged list.
x >= 0Jobs to skip in the paged list. Switches to the paged list.
x >= 0