curl --request POST \
--url https://api.xenia.team/api/v1/ops/template-submissions \
--header 'Content-Type: application/json' \
--header 'x-client-key: <api-key>' \
--header 'x-client-secret: <api-key>' \
--data '
{
"fromDate": "2025-06-01T00:00:00.000Z",
"toDate": "2025-06-30T23:59:59.999Z",
"checklists": [
"3f9a1c22-1d4e-4b6a-9c11-a1b2c3d4e5f6"
],
"statuses": [
"Submitted"
],
"locations": [],
"users": [],
"searchText": "",
"offset": 0,
"limit": 50,
"includeItems": true
}
'import requests
url = "https://api.xenia.team/api/v1/ops/template-submissions"
payload = {
"fromDate": "2025-06-01T00:00:00.000Z",
"toDate": "2025-06-30T23:59:59.999Z",
"checklists": ["3f9a1c22-1d4e-4b6a-9c11-a1b2c3d4e5f6"],
"statuses": ["Submitted"],
"locations": [],
"users": [],
"searchText": "",
"offset": 0,
"limit": 50,
"includeItems": True
}
headers = {
"x-client-key": "<api-key>",
"x-client-secret": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'x-client-key': '<api-key>',
'x-client-secret': '<api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
fromDate: '2025-06-01T00:00:00.000Z',
toDate: '2025-06-30T23:59:59.999Z',
checklists: ['3f9a1c22-1d4e-4b6a-9c11-a1b2c3d4e5f6'],
statuses: ['Submitted'],
locations: [],
users: [],
searchText: '',
offset: 0,
limit: 50,
includeItems: true
})
};
fetch('https://api.xenia.team/api/v1/ops/template-submissions', 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.xenia.team/api/v1/ops/template-submissions",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'fromDate' => '2025-06-01T00:00:00.000Z',
'toDate' => '2025-06-30T23:59:59.999Z',
'checklists' => [
'3f9a1c22-1d4e-4b6a-9c11-a1b2c3d4e5f6'
],
'statuses' => [
'Submitted'
],
'locations' => [
],
'users' => [
],
'searchText' => '',
'offset' => 0,
'limit' => 50,
'includeItems' => true
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-client-key: <api-key>",
"x-client-secret: <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.xenia.team/api/v1/ops/template-submissions"
payload := strings.NewReader("{\n \"fromDate\": \"2025-06-01T00:00:00.000Z\",\n \"toDate\": \"2025-06-30T23:59:59.999Z\",\n \"checklists\": [\n \"3f9a1c22-1d4e-4b6a-9c11-a1b2c3d4e5f6\"\n ],\n \"statuses\": [\n \"Submitted\"\n ],\n \"locations\": [],\n \"users\": [],\n \"searchText\": \"\",\n \"offset\": 0,\n \"limit\": 50,\n \"includeItems\": true\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-client-key", "<api-key>")
req.Header.Add("x-client-secret", "<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.post("https://api.xenia.team/api/v1/ops/template-submissions")
.header("x-client-key", "<api-key>")
.header("x-client-secret", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"fromDate\": \"2025-06-01T00:00:00.000Z\",\n \"toDate\": \"2025-06-30T23:59:59.999Z\",\n \"checklists\": [\n \"3f9a1c22-1d4e-4b6a-9c11-a1b2c3d4e5f6\"\n ],\n \"statuses\": [\n \"Submitted\"\n ],\n \"locations\": [],\n \"users\": [],\n \"searchText\": \"\",\n \"offset\": 0,\n \"limit\": 50,\n \"includeItems\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.xenia.team/api/v1/ops/template-submissions")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-client-key"] = '<api-key>'
request["x-client-secret"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"fromDate\": \"2025-06-01T00:00:00.000Z\",\n \"toDate\": \"2025-06-30T23:59:59.999Z\",\n \"checklists\": [\n \"3f9a1c22-1d4e-4b6a-9c11-a1b2c3d4e5f6\"\n ],\n \"statuses\": [\n \"Submitted\"\n ],\n \"locations\": [],\n \"users\": [],\n \"searchText\": \"\",\n \"offset\": 0,\n \"limit\": 50,\n \"includeItems\": true\n}"
response = http.request(request)
puts response.read_body{
"data": [
{
"id": "8b2c4d6e-0f11-4a23-8b45-c6d7e8f90123",
"name": "Opening Checklist",
"icon": null,
"status": "Submitted",
"progress": {
"completed": 12,
"total": 12
},
"ChecklistId": "3f9a1c22-1d4e-4b6a-9c11-a1b2c3d4e5f6",
"DefaultLocationId": "46715d09-1628-4b1a-a12d-f9e0bbcdbc3c",
"locations": [
"46715d09-1628-4b1a-a12d-f9e0bbcdbc3c"
],
"lastItemUpdatedAt": "2025-06-13T19:21:20.489Z",
"createdAt": "2025-06-13T13:15:53.544Z",
"updatedAt": "2025-06-13T19:21:20.489Z",
"completedAt": "2025-06-13T19:21:20.489Z",
"scoringMethodology": "additive",
"decimalPlacesForScoring": 2,
"autoFailed": false,
"Creator": {
"id": "183f639a-8358-485f-9abe-221d0efcbe8e",
"fullName": "Jane Doe",
"firstName": "Jane",
"lastName": "Doe",
"photo": "@@#7C77B9"
},
"Submitter": {
"id": "183f639a-8358-485f-9abe-221d0efcbe8e",
"fullName": "Jane Doe",
"firstName": "Jane",
"lastName": "Doe",
"photo": "@@#7C77B9"
},
"Task": {
"id": "a1b2c3d4-e5f6-4789-9012-3456789abcde",
"taskNumber": 4821,
"title": "Opening Checklist"
},
"Checklist": {
"id": "3f9a1c22-1d4e-4b6a-9c11-a1b2c3d4e5f6",
"isScoring": false,
"scoringMethodology": "additive",
"decimalPlacesForScoring": 2
},
"SubmissionApproval": null,
"TaskChecklistItems": [
{
"id": "c3d4e5f6-a7b8-4901-9234-567890abcdef",
"name": "Lobby lights on",
"type": "yesNo",
"answers": {
"value": "Yes"
},
"order": 0
}
],
"TaskChecklistSections": []
}
],
"meta": {
"totalCount": 137,
"count": {
"submitted": 120,
"Pending Approval": 8,
"Changes Requested": 3,
"Approved": 5,
"Rejected": 1,
"total": 137
}
}
}Submission Records
Returns submission (checklist log) records for the workspace. All body fields are optional; omitting them returns every non-draft submission. Results are scoped to the locations the key’s default user can access; this endpoint has no separate CAN_VIEW_REPORTING gate.
curl --request POST \
--url https://api.xenia.team/api/v1/ops/template-submissions \
--header 'Content-Type: application/json' \
--header 'x-client-key: <api-key>' \
--header 'x-client-secret: <api-key>' \
--data '
{
"fromDate": "2025-06-01T00:00:00.000Z",
"toDate": "2025-06-30T23:59:59.999Z",
"checklists": [
"3f9a1c22-1d4e-4b6a-9c11-a1b2c3d4e5f6"
],
"statuses": [
"Submitted"
],
"locations": [],
"users": [],
"searchText": "",
"offset": 0,
"limit": 50,
"includeItems": true
}
'import requests
url = "https://api.xenia.team/api/v1/ops/template-submissions"
payload = {
"fromDate": "2025-06-01T00:00:00.000Z",
"toDate": "2025-06-30T23:59:59.999Z",
"checklists": ["3f9a1c22-1d4e-4b6a-9c11-a1b2c3d4e5f6"],
"statuses": ["Submitted"],
"locations": [],
"users": [],
"searchText": "",
"offset": 0,
"limit": 50,
"includeItems": True
}
headers = {
"x-client-key": "<api-key>",
"x-client-secret": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'x-client-key': '<api-key>',
'x-client-secret': '<api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
fromDate: '2025-06-01T00:00:00.000Z',
toDate: '2025-06-30T23:59:59.999Z',
checklists: ['3f9a1c22-1d4e-4b6a-9c11-a1b2c3d4e5f6'],
statuses: ['Submitted'],
locations: [],
users: [],
searchText: '',
offset: 0,
limit: 50,
includeItems: true
})
};
fetch('https://api.xenia.team/api/v1/ops/template-submissions', 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.xenia.team/api/v1/ops/template-submissions",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'fromDate' => '2025-06-01T00:00:00.000Z',
'toDate' => '2025-06-30T23:59:59.999Z',
'checklists' => [
'3f9a1c22-1d4e-4b6a-9c11-a1b2c3d4e5f6'
],
'statuses' => [
'Submitted'
],
'locations' => [
],
'users' => [
],
'searchText' => '',
'offset' => 0,
'limit' => 50,
'includeItems' => true
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-client-key: <api-key>",
"x-client-secret: <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.xenia.team/api/v1/ops/template-submissions"
payload := strings.NewReader("{\n \"fromDate\": \"2025-06-01T00:00:00.000Z\",\n \"toDate\": \"2025-06-30T23:59:59.999Z\",\n \"checklists\": [\n \"3f9a1c22-1d4e-4b6a-9c11-a1b2c3d4e5f6\"\n ],\n \"statuses\": [\n \"Submitted\"\n ],\n \"locations\": [],\n \"users\": [],\n \"searchText\": \"\",\n \"offset\": 0,\n \"limit\": 50,\n \"includeItems\": true\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-client-key", "<api-key>")
req.Header.Add("x-client-secret", "<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.post("https://api.xenia.team/api/v1/ops/template-submissions")
.header("x-client-key", "<api-key>")
.header("x-client-secret", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"fromDate\": \"2025-06-01T00:00:00.000Z\",\n \"toDate\": \"2025-06-30T23:59:59.999Z\",\n \"checklists\": [\n \"3f9a1c22-1d4e-4b6a-9c11-a1b2c3d4e5f6\"\n ],\n \"statuses\": [\n \"Submitted\"\n ],\n \"locations\": [],\n \"users\": [],\n \"searchText\": \"\",\n \"offset\": 0,\n \"limit\": 50,\n \"includeItems\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.xenia.team/api/v1/ops/template-submissions")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-client-key"] = '<api-key>'
request["x-client-secret"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"fromDate\": \"2025-06-01T00:00:00.000Z\",\n \"toDate\": \"2025-06-30T23:59:59.999Z\",\n \"checklists\": [\n \"3f9a1c22-1d4e-4b6a-9c11-a1b2c3d4e5f6\"\n ],\n \"statuses\": [\n \"Submitted\"\n ],\n \"locations\": [],\n \"users\": [],\n \"searchText\": \"\",\n \"offset\": 0,\n \"limit\": 50,\n \"includeItems\": true\n}"
response = http.request(request)
puts response.read_body{
"data": [
{
"id": "8b2c4d6e-0f11-4a23-8b45-c6d7e8f90123",
"name": "Opening Checklist",
"icon": null,
"status": "Submitted",
"progress": {
"completed": 12,
"total": 12
},
"ChecklistId": "3f9a1c22-1d4e-4b6a-9c11-a1b2c3d4e5f6",
"DefaultLocationId": "46715d09-1628-4b1a-a12d-f9e0bbcdbc3c",
"locations": [
"46715d09-1628-4b1a-a12d-f9e0bbcdbc3c"
],
"lastItemUpdatedAt": "2025-06-13T19:21:20.489Z",
"createdAt": "2025-06-13T13:15:53.544Z",
"updatedAt": "2025-06-13T19:21:20.489Z",
"completedAt": "2025-06-13T19:21:20.489Z",
"scoringMethodology": "additive",
"decimalPlacesForScoring": 2,
"autoFailed": false,
"Creator": {
"id": "183f639a-8358-485f-9abe-221d0efcbe8e",
"fullName": "Jane Doe",
"firstName": "Jane",
"lastName": "Doe",
"photo": "@@#7C77B9"
},
"Submitter": {
"id": "183f639a-8358-485f-9abe-221d0efcbe8e",
"fullName": "Jane Doe",
"firstName": "Jane",
"lastName": "Doe",
"photo": "@@#7C77B9"
},
"Task": {
"id": "a1b2c3d4-e5f6-4789-9012-3456789abcde",
"taskNumber": 4821,
"title": "Opening Checklist"
},
"Checklist": {
"id": "3f9a1c22-1d4e-4b6a-9c11-a1b2c3d4e5f6",
"isScoring": false,
"scoringMethodology": "additive",
"decimalPlacesForScoring": 2
},
"SubmissionApproval": null,
"TaskChecklistItems": [
{
"id": "c3d4e5f6-a7b8-4901-9234-567890abcdef",
"name": "Lobby lights on",
"type": "yesNo",
"answers": {
"value": "Yes"
},
"order": 0
}
],
"TaskChecklistSections": []
}
],
"meta": {
"totalCount": 137,
"count": {
"submitted": 120,
"Pending Approval": 8,
"Changes Requested": 3,
"Approved": 5,
"Rejected": 1,
"total": 137
}
}
}includeItems: false to omit per-submission answers. meta.totalCount is the total number of matching rows (for paging) and meta.count is the per-status breakdown. Results are scoped to the locations the key’s default user can access; this endpoint has no separate CAN_VIEW_REPORTING gate.Body
Start of the submission date range (filters on lastItemUpdatedAt). Requires toDate to also be set.
End of the submission date range. Requires fromDate to also be set.
Template (ChecklistId) UUIDs to include.
Submission statuses to include, e.g. "Submitted", "In Progress".
Location UUIDs. Matches the submission's default location or any hierarchy location.
User UUIDs. Matches the creator, updater, or last item updater.
Free-text match against the template name and the submitter/updater name.
Row offset for paging.
Maximum rows to return. Defaults to effectively all rows.
When true, each submission includes its answered items and sections (TaskChecklistItems / TaskChecklistSections).
Response
Submission records retrieved successfully.