---
title: "Update an issue"
method: PATCH
path: "/issues/{issueId}"
tags: ["Issues"]
---

# Update an issue

`PATCH /issues/{issueId}`

## Request

- Base URL: `https://api.marboba.com/v1`
- URL: `https://api.marboba.com/v1/issues/{issueId}`
- Auth: HTTP bearer

Setting `status` recomputes `statusGroup` server-side. The audit log emits a specialized event (ISSUE_STATUS_CHANGED, ISSUE_ASSIGNED, ISSUE_PRIORITY_CHANGED, ISSUE_TYPE_CHANGED) when one of those high-signal fields actually changed.

## Request body

- IssueInput: Create body. `appId` and `title` are required; everything else uses sensible defaults.
  - `appId` string, required
  - `title` string, required
  - `description` string
  - `severity` 'minor' | 'major' | 'critical' | 'blocker'
  - `status` 'newBug' | 'triaged' | 'inProgress' | 'blocked' | 'fixed' | 'verified' | 'wontFix' | 'duplicate'
  - `issueType` 'bug' | 'enhancement' | 'feature' | 'task'
  - `assignedToUid` string, nullable
  - `labels` string[]
  - `dueDate` string, date-time, nullable
  - `startDate` string, date-time, nullable
  - `estimateMinutes` integer, nullable

## Response `200`

Updated

- object
  - `issue` Issue: An issue / bug / task / improvement / feature. The /v1 surface exposes the basics every automation tool needs (title / status / assignee / labels / dates) and skips the in-app rich fields (relations, linked PRs, SLA, time tracking, type-specific blobs).
    - `id` string, required
    - `sequenceNumber` integer, nullable: Org-wide sequential issue number assigned by a Firestore trigger after create. May be null on docs that were just created.
    - `appId` string, required: Owning project (component) id.
    - `title` string, required
    - `description` string
    - `severity` 'minor' | 'major' | 'critical' | 'blocker', required
    - `status` 'newBug' | 'triaged' | 'inProgress' | 'blocked' | 'fixed' | 'verified' | 'wontFix' | 'duplicate', required
    - `statusGroup` 'backlog' | 'active' | 'done' | 'closed', required: Denormalized board column derived server-side from `status`. Read-only — set `status` and the server picks the right group.
    - `issueType` 'bug' | 'enhancement' | 'feature' | 'task', required
    - `assignedToUid` string, nullable
    - `labels` string[], required
    - `dueDate` string, date-time, nullable
    - `startDate` string, date-time, nullable
    - `estimateMinutes` integer, nullable
    - `githubIssueNumber` integer, nullable
    - `githubIssueUrl` string, nullable
    - `jiraIssueKey` string, nullable
    - `jiraIssueUrl` string, nullable
    - `createdAt` string, date-time, nullable
    - `updatedAt` string, date-time, nullable
    - `version` integer, required: Optimistic-concurrency counter, increments on every successful update.

## Other responses

- `400` (unresolved $ref)
- `403` (unresolved $ref)
- `404` (unresolved $ref)

---

[API](https://skmtc.dev/marboba/apis/marboba-public-rest-api.md) · [All operations](https://skmtc.dev/marboba/apis/marboba-public-rest-api/llms.txt) · [OpenAPI document](https://skmtc.dev/marboba/apis/marboba-public-rest-api/revisions/5b96d525d88d?raw)
