Tickets
Create, update, assign, and transition tickets -- the core work items in Spedy.
Tickets are the fundamental work items in Spedy. Every task, bug, feature request, or piece of work lives as a ticket on a board. Tickets support statuses, priorities, assignments, labels, due dates, time estimates, and more.
List Tickets
GET /api/v1/boards/{boardId}/ticketsReturns a paginated list of tickets on the board.
Query Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| page | number | No | Page number (default: 1) |
| limit | number | No | Items per page (default: 20, max: 100) |
| statusId | string | No | Filter by status ID |
| assigneeId | string | No | Filter by assignee user ID |
| customerId | string | No | Filter by customer ID |
| typeId | string | No | Filter by ticket type ID (comma-separated for multiple) |
| labelId | string | No | Filter by label ID (comma-separated for multiple) |
| search | string | No | Search in title and description |
| includePlanning | boolean | No | Include tickets in PLANNING statuses (default: false) |
| includeArchived | boolean | No | Include archived/done tickets |
| overdue | boolean | No | Only overdue tickets |
| noDueDate | boolean | No | Only tickets without a due date |
| dueBefore | string | No | Tickets due on or before this date (ISO 8601) |
| dueAfter | string | No | Tickets due on or after this date (ISO 8601) |
| impactLevel | string | No | Filter by impact level (comma-separated) |
| externalReference | string | No | Filter by external reference (partial match) |
Example Response
{
"data": [
{
"id": "tkt_abc123",
"displayId": "WEB-42",
"title": "Fix login page styling",
"status": {
"id": "sts_def456",
"name": "In Progress",
"category": "ACTIVE"
},
"priority": "HIGH",
"assignee": {
"id": "usr_abc123",
"name": "Alex Smith"
},
"type": {
"id": "typ_abc123",
"name": "Bug"
},
"labels": [],
"dueDate": "2025-04-01T00:00:00Z",
"createdAt": "2025-03-15T10:00:00Z"
}
],
"total": 42,
"page": 1,
"pageSize": 20,
"totalPages": 3
}Create Ticket
POST /api/v1/boards/{boardId}/ticketsRequest Body
| Field | Type | Required | Description |
|---|---|---|---|
| title | string | Yes | Ticket title (max 200 characters) |
| description | string | No | Detailed description (max 50,000 characters) |
| statusId | string | No | Initial status ID (defaults to Backlog) |
| assigneeId | string | No | Assignee user ID |
| customerId | string | No | Customer ID |
| priority | string | No | LOW, MEDIUM, HIGH, or CRITICAL |
| typeId | string | No | Ticket type ID |
| labelIds | string[] | No | Label IDs to attach |
| dueDate | string | No | Due date (ISO 8601) |
| startDate | string | No | Planned start date (ISO 8601) |
| estimatedHours | number | No | Estimated hours (min 0.1) |
| storyPoints | number | No | Story points |
| externalReference | string | No | External reference ID (max 200 characters) |
| impactLevel | string | No | LOW, MEDIUM, HIGH, or CRITICAL |
| milestoneId | string | No | Milestone ID to assign |
Example Request
{
"title": "Fix login page styling",
"description": "The login button is misaligned on mobile devices.",
"priority": "HIGH",
"typeId": "typ_bug123",
"assigneeId": "usr_abc123",
"labelIds": ["lbl_frontend"],
"dueDate": "2025-04-01T00:00:00Z"
}Get Ticket
GET /api/v1/boards/{boardId}/tickets/{ticketId}Returns full ticket details including description, comments count, attachment count, and related data.
Update Ticket
PATCH /api/v1/boards/{boardId}/tickets/{ticketId}All fields are optional. Send only the fields you want to change. Set a field to null to clear it.
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
| title | string | No | Ticket title |
| description | string | No | Detailed description |
| assigneeId | string | null | No | Assignee (null to unassign) |
| customerId | string | null | No | Customer (null to remove) |
| priority | string | null | No | Priority level (null to remove) |
| typeId | string | No | Ticket type ID |
| statusId | string | No | Status ID |
| labelIds | string[] | No | Label IDs (replaces existing labels) |
| dueDate | string | null | No | Due date (null to remove) |
| startDate | string | null | No | Start date (null to remove) |
| estimatedHours | number | null | No | Estimated hours (null to remove) |
| storyPoints | number | null | No | Story points (null to remove) |
| externalReference | string | null | No | External reference (null to remove) |
| impactLevel | string | null | No | Impact level (null to remove) |
| milestoneId | string | null | No | Milestone ID (null to unassign) |
| resolution | string | null | No | Resolution description |
| resolutionType | string | null | No | fixed, wont_fix, duplicate, cannot_reproduce, or by_design |
Delete Ticket
DELETE /api/v1/boards/{boardId}/tickets/{ticketId}Permanently deletes the ticket. Returns 204 No Content.
Update Ticket Status
PATCH /api/v1/boards/{boardId}/tickets/{ticketId}/statusChange the ticket's workflow status.
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
| statusId | string | Yes | Target status ID |
Assign Ticket
PATCH /api/v1/boards/{boardId}/tickets/{ticketId}/assignAssign or unassign a user from the ticket.
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
| assigneeId | string | null | Yes | User ID to assign, or null to unassign |
Move Ticket
POST /api/v1/boards/{boardId}/tickets/{ticketId}/moveMove a ticket to a different board.
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
| targetBoardId | string | Yes | Destination board ID |
Example Response
{
"data": {
"id": "tkt_abc123",
"displayId": "NEW-1",
"title": "Fix login page styling",
"boardId": "brd_newboard"
}
}Transition Ticket
POST /api/v1/boards/{boardId}/tickets/{ticketId}/transitionTransition a ticket to a new status with optional validation of transition rules.
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
| statusId | string | Yes | Target status ID |
| statusChangeReason | string | No | Reason for the transition |
Approve Ticket
POST /api/v1/boards/{boardId}/tickets/{ticketId}/approveApprove a ticket that's in a planning/backlog status, moving it into the active workflow.