Create, read, update, and manage issues programmatically.
/api/v1/issues
Returns a paginated list of issues in the current project scope.
| Parameter | Type | Description |
|---|---|---|
status | string | Filter by status: open, in_progress, closed |
type | string | Filter by type: task, bug, story, epic, decision |
priority | int | Filter by priority (0-4) |
assignee | string | Filter by assignee user ID |
label | string | Filter by label name |
dueBefore | datetime | Issues due before this date |
dueAfter | datetime | Issues due after this date |
includeDeferred | bool | Include deferred issues (default: false) |
sortBy | string | created, updated, priority, due |
page | int | Page number (default: 1) |
pageSize | int | Items per page (default: 25) |
curl -H "Authorization: Bearer gkey_..." \
"https://app.gnoll.ai/api/v1/issues?status=open&type=task&sortBy=priority"
/api/v1/issues/{id}
Returns the full detail of a single issue including labels, comments count, child count, and completion percentage.
/api/v1/issues
{
"title": "Implement user authentication",
"type": "task",
"priority": 3,
"body": "Add login/logout with JWT tokens",
"assigneeId": "user-id",
"parentId": "epic-id",
"dueAt": "2025-04-01T00:00:00Z",
"labelIds": [1, 2],
"estimatedMinutes": 120,
"acceptanceCriteria": "User can log in with email and password"
}
| Field | Required | Description |
|---|---|---|
title | Yes | Issue title (1-500 chars) |
type | Yes | task, bug, story, epic, decision |
priority | No | 0-4 (default: 0) |
body | No | Detailed description |
assigneeId | No | User ID to assign |
parentId | No | Parent issue ID (for nesting under epics) |
dueAt | No | Due date (ISO 8601) |
labelIds | No | Array of label IDs to attach |
estimatedMinutes | No | Time estimate in minutes (integer) |
acceptanceCriteria | No | Definition of done for this issue |
/api/v1/issues/{id}
Partial update — only send the fields you want to change.
{
"title": "Updated title",
"priority": 4,
"status": "in_progress",
"estimatedMinutes": 90,
"acceptanceCriteria": "Tests pass"
}
/api/v1/issues/{id}/close
Closes the issue and triggers any automation rules. Optionally include a closing comment:
{ "comment": "Fixed in PR #42" }
/api/v1/issues/{id}/reopen
/api/v1/issues/{id}/claim
Assigns the issue to the authenticated user and sets status to in_progress.
/api/v1/issues/{id}/defer
{ "deferUntil": "2025-04-15T00:00:00Z" }
/api/v1/issues/{id}/undefer
/api/v1/issues/{id}/move
{
"targetProjectId": "project-id",
"moveChildren": true
}
Moves the issue (and optionally its children) to another project. Returns the count of moved children and cross-project dependencies.
/api/v1/issues/{id}/history
Returns the parsed change history for an issue, with structured field-level diffs.
/api/v1/issues/{id}/history/{eventId}/revert
Reverts a specific field change from an "updated" event.
/api/v1/issues/{id}
Permanently deletes an issue and its associated data.
Bulk endpoints accept an array of issue IDs:
/api/v1/issues/bulk/close
/api/v1/issues/bulk/reopen
/api/v1/issues/bulk/status
/api/v1/issues/bulk/priority
/api/v1/issues/bulk/delete
// Example: bulk close
POST /api/v1/issues/bulk/close
{ "issueIds": ["abc123", "def456", "ghi789"] }
/api/v1/issues/stale?days=14&type=task&sortBy=stalest
/api/v1/duplicates/scan?status=open&minScore=50
/api/v1/issues/{id}/mark-duplicate
{ "duplicateOfId": "original-issue-id" }