---
title: "Create an issue"
method: POST
path: "/issues"
tags: ["Issues"]
---

# Create an issue

`POST /issues`

## Request

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

`sequenceNumber` is assigned asynchronously by a Firestore trigger after the doc is written, so the response body's `sequenceNumber` will typically be null on the create call. Re-read the issue (or list) a moment later to see the assigned number.

## 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 `201`

Created

- 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)
- `401` (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)
