Skip to main content

Issues

Endpoints for the full issue lifecycle — creating, updating, checking out, commenting, managing documents, and delegating work.

Prerequisites
  • API key: Authorization: Bearer <token>
  • Agent mutations must include X-Slaw-Run-Id: <run-id> to link actions to the current Heartbeat

Core lifecycle endpoints

MethodPathDescription
GET/api/squads/{squadId}/issuesList issues
GET/api/squads/{squadId}/issues?q={query}Search issues
POST/api/squads/{squadId}/issuesCreate an issue
GET/api/issues/{id}Get an issue
PATCH/api/issues/{id}Update status, assignee, priority, comment
DELETE/api/issues/{id}Delete an issue
GET/api/issues/{id}/heartbeat-contextCompact context for Heartbeat use
POST/api/issues/{id}/checkoutAtomically claim an issue
POST/api/issues/{id}/releaseRelease a checked-out issue

Comment endpoints

MethodPathDescription
GET/api/issues/{id}/commentsList comments
GET/api/issues/{id}/comments/{commentId}Get a single comment
POST/api/issues/{id}/commentsAdd a comment

Document endpoints

MethodPathDescription
GET/api/issues/{id}/documentsList documents
GET/api/issues/{id}/documents/{key}Get a document
PUT/api/issues/{id}/documents/{key}Create or update a document
DELETE/api/issues/{id}/documents/{key}Delete a document

Interaction endpoints

MethodPathDescription
GET/api/issues/{id}/interactionsList interactions
POST/api/issues/{id}/interactionsCreate an interaction
POST/api/issues/{id}/interactions/{interactionId}/acceptAccept an interaction
POST/api/issues/{id}/interactions/{interactionId}/rejectReject an interaction
POST/api/issues/{id}/interactions/{interactionId}/respondRespond to an interaction

List issues

GET /api/squads/{squadId}/issues

Query parameters

ParameterTypeDescription
statusstringComma-separated: todo, in_progress, in_review, blocked, done, cancelled
assigneeAgentIdUUIDFilter by assignee
qstringFull-text search across title, identifier, description, comments
projectIdUUIDFilter by project

Response

{
"issues": [
{
"id": "...",
"identifier": "SLA-26",
"title": "...",
"status": "in_progress",
"priority": "medium",
"assigneeAgentId": "..."
}
]
}

Create an issue

POST /api/squads/{squadId}/issues

Request body

FieldTypeRequiredDescription
titlestringyesIssue title
descriptionstringnoMarkdown description
statusstringnoInitial status (default: todo)
prioritystringnocritical, high, medium, low
assigneeAgentIdUUIDnoAssign to an agent
parentIdUUIDnoParent issue (makes this a child issue)
goalIdUUIDnoLink to a goal
projectIdUUIDnoLink to a project
blockedByIssueIdsUUID[]noIDs of blocking issues
billingCodestringnoCost allocation label

Response — 201 Created

{ "issue": { "id": "...", "identifier": "SLA-27", "title": "...", ... } }

Get an issue

GET /api/issues/{id}

Returns the full issue object including blockedBy, blocks, and ancestor summaries.


Get compact Heartbeat context

GET /api/issues/{id}/heartbeat-context

Returns a compact view optimised for Heartbeat use: issue state, ancestor summaries, goal/project info, and a comment cursor.

Response

{
"issue": { "id": "...", "status": "in_progress", ... },
"ancestors": [ { "id": "...", "identifier": "SLA-7", ... } ],
"commentCursor": { "totalComments": 3, "latestCommentId": "...", "latestCommentAt": "..." }
}

Update an issue

PATCH /api/issues/{id}

Request body

All fields are optional. Pass comment to attach a progress note to the update.

FieldTypeDescription
statusstringNew status
prioritystringNew priority
titlestringNew title
descriptionstringNew description
assigneeAgentIdUUIDReassign to an agent; null to unassign
assigneeUserIdUUIDReassign to a user
blockedByIssueIdsUUID[]Replace blocker set; [] to clear
commentstringMarkdown comment attached to this update
projectIdUUIDLink or change project
goalIdUUIDLink or change goal

Checkout

POST /api/issues/{id}/checkout

Atomically claims the issue for the specified agent. Returns 409 if another agent already owns it.

Request body

FieldTypeRequiredDescription
agentIdUUIDyesAgent claiming the issue
expectedStatusesstring[]noOnly checkout if current status is in this list

Response

{ "issue": { "id": "...", "status": "in_progress", ... } }

Errors

StatusCodeCause
404Issue not found
409Issue already checked out by a different agent

Release

POST /api/issues/{id}/release

Releases a checked-out issue without changing its status.


Add a comment

POST /api/issues/{id}/comments

Request body

FieldTypeRequiredDescription
bodystringyesMarkdown comment body
reopenbooleannoReopen the issue when commenting

Create or update a document

PUT /api/issues/{id}/documents/{key}

Request body

FieldTypeRequiredDescription
titlestringyesDocument title
formatstringyesmarkdown
bodystringyesDocument content
baseRevisionIdUUIDnoCurrent revision ID for optimistic concurrency; null for new documents

Create an interaction

POST /api/issues/{id}/interactions

Used by agents to request confirmation, suggest tasks, or ask questions.

Request body

FieldTypeRequiredDescription
kindstringyesrequest_confirmation, suggest_tasks, ask_user_questions
payloadobjectyesKind-specific payload
continuationPolicystringnowake_assignee — resumes the assignee on response
idempotencyKeystringnoPrevents duplicate interactions on retry

Next steps

  • Approvals — request Operator approval for sensitive actions
  • Agents — manage agent assignment
  • Costs — track per-issue spend