Tickets
The tickets your team tracks in Polaris, the same ones the Tickets page lists. Use this endpoint to show open problems on your own dashboard, or to follow a ticket from the moment it was raised to the moment it was fixed.
Tickets come from three places, shown in source:
manual: someone opened it in the app.alert: Polaris opened it automatically because a device stayed offline. For these ticketsdetectedAtis when the device went offline.system: other automation.
You only get what the workspace itself can see. Staff-only comments are not counted, and the person working on a ticket is given by name, never by email address.
List tickets GET /v1/tickets
Returns the tickets in your token's workspaces, oldest first. Every filter is optional. With none, you get every ticket, whatever its status.
Query parameters
statusstringopen,in_progress,waiting,resolvedorclosed. Repeat the parameter or pass a comma separated list. Multiple values mean any of them. For the tickets still being worked on, passopen,in_progress,waiting.severitystringminor,majororcritical. Same list rules asstatus.categorystringno_service,topuporsuggestion. Same list rules asstatus.sourcestringmanual,alertorsystem. Same list rules asstatus.tagstringRestrict to tickets that carry any of these tags, e.g.
offline. Same list rules asstatus.siteCodestringRestrict to tickets about devices at one or more sites. Repeat the parameter or pass a comma separated list, and match is case-insensitive. Takes the same
siteCodeas/v1/alerts.gatewayIdstringRestrict to tickets about one or more devices. Takes the same
gatewayIdas/v1/alerts.fromdateOnly tickets created on or after this day,
YYYY-MM-DDin Philippine time.todateOnly tickets created on or before this day. Unlike the report data endpoints,
fromandtocan be used on their own, there is no limit on the range, and leaving both out returns every ticket.workspaceIdstringScope to a single workspace. Must be one returned by
GET /v1/workspaces. An id outside your token's set returns403.pageSizeintegerRows per page, 1 to 500. Defaults to 100.
pageTokenstringnextPageTokenfrom the previous response.
An unknown status, severity or category value returns 400 rather than an empty page, so a typo can't look like "no tickets".
Response object
idstringUnique identifier of the ticket.
numberintegerThe ticket's number within its workspace, as shown in the app (
#12).workspaceIdstringWorkspace the ticket belongs to. Matches
idon/v1/workspaces.titlestringTitle of the ticket.
bodystringDescription as written in the app (Markdown), or
nullwhen there is none.statusstringopen,in_progress,waiting,resolvedorclosed.severitystringminor,majororcritical.categorystringno_service,topuporsuggestion, ornullfor a ticket opened without one.sourcestringmanual,alertorsystem.tagsstring[]Tags on the ticket. An empty array when there are none.
siteCodestringSite of the device the ticket is about, or
null.deviceNamestringDisplay name of the device, or
nullwhen the ticket isn't about a device.gatewayIdstringUnique identifier of the device, or
null.deviceTypestringAccess Point,Gateway,Terminal, and so on, ornull.assignedTostringName of the person working on it, or
nullwhile nobody is assigned.commentCountintegerComments the workspace can see. Staff-only notes are not counted.
detectedAtstringRFC3339 instant the problem began.
resolvedAtstringRFC3339 instant the ticket was resolved, or
null.closedAtstringRFC3339 instant the ticket was closed, or
null.createdAtstringRFC3339 instant the ticket was opened.
updatedAtstringRFC3339 instant of the last change.
- cURL
- JavaScript
- Go
- PHP
curl "https://polaris.revlv.com/v1/tickets?status=open,in_progress,waiting" \
-H "Authorization: Bearer {token}"
const res = await fetch(
'https://polaris.revlv.com/v1/tickets?status=open,in_progress,waiting',
{ headers: { 'Authorization': 'Bearer {token}' } },
);
const { data } = await res.json();
req, _ := http.NewRequest("GET",
"https://polaris.revlv.com/v1/tickets?status=open,in_progress,waiting", nil)
req.Header.Add("Authorization", "Bearer {token}")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
$response = $client->get('https://polaris.revlv.com/v1/tickets', [
'headers' => ['Authorization' => 'Bearer {token}'],
'query' => ['status' => 'open,in_progress,waiting'],
]);
echo $response->getBody();
{
"data": [
{
"id": "3f6c1d2a-8b4e-4f1a-9c2d-5e7a8b9c0d1e",
"number": 41,
"workspaceId": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",
"title": "Terminal offline: PH1-2026-549 Barangay Hall",
"body": "- **Site:** PH1-2026-549\n\nOpened automatically after 2 hours offline.",
"status": "open",
"severity": "major",
"category": "no_service",
"source": "alert",
"tags": ["no-service", "offline"],
"siteCode": "PH1-2026-549",
"deviceName": "PH1-2026-549 Barangay Hall",
"gatewayId": "KIT304125478",
"deviceType": "Terminal",
"assignedTo": null,
"commentCount": 1,
"detectedAt": "2026-10-01T22:15:00Z",
"resolvedAt": null,
"closedAt": null,
"createdAt": "2026-10-02T00:15:00Z",
"updatedAt": "2026-10-02T00:15:00Z"
},
{
"id": "9a8b7c6d-5e4f-4a3b-8c2d-1e0f9a8b7c6d",
"number": 42,
"workspaceId": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",
"title": "Data top-up",
"body": "Please add 50 GB before the weekend event.",
"status": "in_progress",
"severity": "minor",
"category": "topup",
"source": "manual",
"tags": ["top-up"],
"siteCode": null,
"deviceName": null,
"gatewayId": null,
"deviceType": null,
"assignedTo": "Maria Santos",
"commentCount": 3,
"detectedAt": "2026-10-02T01:40:00Z",
"resolvedAt": null,
"closedAt": null,
"createdAt": "2026-10-02T01:40:00Z",
"updatedAt": "2026-10-02T03:05:00Z"
}
],
"pageInfo": {
"hasNextPage": false,
"nextPageToken": ""
}
}