The board is the ticket list grouped by state, one column per state in workflow order. Column order is priority first (highest at the top), then most recent activity. Archived tickets are never on a board. All three operations return TicketSummary items, described on Tickets.
GET /api/w/{slug}/board
The board for the whole workspace or one project. Token: yes, read. The query accepts every filter of GET /tickets (projectId, stateIds, kindIds, labelIds, priorityIds, stateCategory, assigneeId, reporterId, viewerId, billingClientId, billingPolicy, due, q, queue); limit (1–50, default 50) caps each column, and cursor is ignored here.
Request
curl "https://saq.no/api/w/acme/board?projectId=01924c3e-6b2a-7d11-9d0e-3a1f4b5c6d7e&limit=20" \
-H 'Authorization: Bearer saq_YOUR_TOKEN'
Response 200 (Board)
{
"columns": [
{
"state": {
"id": "01924c3e-0002-7000-8000-000000000001",
"key": "backlog",
"name": "Backlog",
"category": "open"
},
"total": 37,
"tickets": [],
"nextCursor": "MHwyMDI2LTA5LTE5VDEwOjE1OjAwLjAwMFp8MDE5MjRjM2U"
},
{
"state": {
"id": "01924c3e-0002-7000-8000-000000000005",
"key": "done",
"name": "Done",
"category": "closed"
},
"total": 2,
"tickets": [],
"nextCursor": null
}
]
}
| Field | Type | Meaning |
|---|---|---|
columns[].state |
object | id, key, name, category (open or closed) |
columns[].total |
integer | Tickets in the column after filtering, beyond the page shown |
columns[].tickets[] |
TicketSummary | The first page, in board order |
columns[].nextCursor |
string or null | Cursor for GET /board/{stateId}; null when the column is complete |
| Error | Status | When |
|---|---|---|
invalid |
400 | Bad query value |
forbidden |
403 | Missing read scope |
GET /api/w/{slug}/board/{stateId}
The next page of one column, in board order. Token: yes, read. Send the same filters as for the board plus cursor from that column's nextCursor and an optional limit.
curl "https://saq.no/api/w/acme/board/01924c3e-0002-7000-8000-000000000001?projectId=01924c3e-6b2a-7d11-9d0e-3a1f4b5c6d7e&cursor=MHwyMDI2LTA5LTE5VDEwOjE1OjAwLjAwMFp8MDE5MjRjM2U" \
-H 'Authorization: Bearer saq_YOUR_TOKEN'
Response 200 (TicketList): { "items": TicketSummary[], "nextCursor": string | null }.
| Error | Status | When |
|---|---|---|
invalid |
400 | details.reason: "bad_cursor", or stateId is not a UUID |
GET /api/w/{slug}/my
The caller's personal lists. Token: yes, read. No parameters.
curl https://saq.no/api/w/acme/my \
-H 'Authorization: Bearer saq_YOUR_TOKEN'
Response 200 (MyWork)
{
"assigned": [],
"reported": [],
"watching": [],
"dueSoon": []
}
| Field | Meaning |
|---|---|
assigned |
Open tickets assigned to the caller |
reported |
Tickets the caller started |
watching |
Tickets the caller is a viewer on |
dueSoon |
Visible tickets with a due date coming up |
Each list holds TicketSummary items. For an agent account, assigned and reported refer to the agent itself.