Planissues
POST/repositories/{repo_id}/issues
File a work item in a repository
create_issue
issue:create
A token needs theissue:createscope: File work itemsGranted bymcp_agent_write,write_api,write_repository.Every operation this scope unlocksAudited · mutation
x-gitmoap-audit: {"kind":"audited","arg":"mutation"}
Quota · open issues per scope
x-gitmoap-quota: {"kind":"enforced","arg":"open_issues_per_scope"}
Files a work item in the repository. Only a title is required; the type, status, assignees, labels, milestone, points, severity and parent are optional. The work item is numbered within the repository, and that number is how other operations and references name it.
Parameters
Path
- repo_idRepositoryId (string · uuid)Repository ID
Request body
application/json- titleIssueTitle (string)
- assignee_idsarray of PrincipalId (string · uuid)optional
- descriptionMarkdownDoc (string) or nulloptional
- labelsarray of LabelKey (string)optional
- milestone_idMilestoneId (string · uuid) or nulloptional
parent_refIssueRef or nulloptional
- The IssueRef schema
- iidIssueId (integer · int64)
- scopeScopeRef
- pointsinteger · int32 or nulloptional0–∞
- severitySeveritycriticalhighmediumlowor nulloptional
- status_idStatusId (string) or nulloptionalDefaults to the effective status set's default status.
type_profileBlueprintRef or nulloptionalFile the item as a custom type, naming a blueprint defined where the item is filed or on a group above it. The blueprint's base type replaces
work_item_type, and the item is created with the blueprint's facets already added to its Definition of Done as criteria.- The BlueprintRef schema
- blueprint_idBlueprintId (string)
- scopeScopeRef
- work_item_typeWorkItemTypeepicstorybugtaskspikechoreincidentsub_taskor nulloptionalDefaults to the scope's effective
default_issue_type.
Request body exampleSynthesized example
{
"title": "Inline scalar newtypes but keep their brand"
}
Responses
201Work item createdapplication/json
- created_atstring
created_byActorSummaryWho created the work item, as they were when they created it.
- The ActorSummary schema
- emailstring
- idstring
- usernamestring
- avatar_urlstring or nulloptional
- iidIssueId (integer · int64)
- root_scope_idGroupId (string · uuid)The top-level group the item's group or repository belongs to.
- scope_idstring
- scope_typeScopeTypegrouprepositoryWhether the item lives in a group or a repository. With
scope_idandiidit forms the item's current address — the#412a person types — which changes when the item moves. - status_categoryStatusCategorytriagetodoin_progressin_reviewblockeddonecancelledThe fixed category of the item's current status, which boards, filters and progress rollups work from.
- status_idStatusId (string)
- titleIssueTitle (string)
- uidIssueUid (string · uuid)The work item's permanent identifier. Unlike its number, it never changes, even when the item moves to another group or repository.
- updated_atstringWhen the work item last changed, ISO 8601. Listings order by it, newest first.
- work_item_typeWorkItemTypeepicstorybugtaskspikechoreincidentsub_taskThe kind of work item. The type decides where an item may live (a group or a repository), which types it may have as children, and which fields it accepts.
- ancestor_group_idsarray of GroupId (string · uuid)optionalThe groups the item sits beneath, nearest first.
- ancestor_issue_uidsarray of IssueUid (string · uuid)optionalThe item's ancestors' permanent identifiers, nearest first, for display. It can briefly lag behind a change of parent higher up the chain.
- assignee_idsarray of PrincipalId (string · uuid)optionalThe people assigned to the work item. Absent when nobody is.
- author_can_pushboolean or nulloptionalWhether the author can push to where this work item lives — its repository, or a group work item's group. False for a drive-by contributor's text. Absent where it was not computed.
- closed_atstring or nulloptional
- closed_byPrincipalId (string · uuid) or nulloptional
- descriptionMarkdownDoc (string) or nulloptional
- labelsarray of LabelKey (string)optionalThe keys of the labels applied to the work item. Absent when it has none.
- milestone_idMilestoneId (string · uuid) or nulloptional
- milestone_scope_idstring or nulloptional
- milestone_scope_typeScopeTypegrouprepositoryor nulloptionalWhether the item's milestone belongs to a group or a repository — not necessarily the item's own, since a group milestone can hold work items from several repositories.
parent_refIssueRef or nulloptionalThe parent's current address, for display. Absent when the item has no parent.
- The IssueRef schema
- iidIssueId (integer · int64)
- scopeScopeRef
- parent_uidIssueUid (string · uuid) or nulloptionalThe parent work item's permanent identifier, if the item has a parent.
- pointsinteger · int32 or nulloptional0–∞
- regressed_atstring or nulloptional
- regressed_at_shaCommitHash (string) or nulloptionalThe commit whose evidence proved the regression — the first known bad commit, and the upper end of the range of suspect commits.
- regressed_from_shaCommitHash (string) or nulloptionalThe commit at which the item was last verified, kept when it regresses — the last known good commit.
- regressed_run_idPipelineRunId (string · uuid) or nulloptional
- severitySeveritycriticalhighmediumlowor nulloptional
type_profileBlueprintRef or nulloptionalThe custom type this item was filed as, pointing at the group or repository where the blueprint is defined.
work_item_typestill decides where the item may live, its children and its fields; the blueprint adds a display label and facets. Absent for an item filed as a plain built-in type.- The BlueprintRef schema
- blueprint_idBlueprintId (string)
- scopeScopeRef
- verificationVerificationStateunverifiedverifiedregressedoptionalWhether CI has proved the work item's acceptance criteria.
unverifieduntil a pipeline run proves them,verifiedonce one has, andregressedwhen a later run shows that evidence no longer holds. - verified_atstring or nulloptional
- verified_at_shaCommitHash (string) or nulloptionalThe commit at which CI proved the acceptance criteria. Absent until a pipeline run has.
- verified_run_idPipelineRunId (string · uuid) or nulloptional
- versioninteger · int64optional0–∞The work item's revision, incremented on every change. Send it back with an update; if the item has changed since you read it, the update is refused with a
409.
201 exampleSynthesized example
{
"created_at": "2026-10-09T15:54:39Z",
"created_by": {
"email": "tomas@acme.example",
"id": "id-6592",
"username": "tomas",
"avatar_url": "https://gitmoap.example/acme/7995afc2"
},
"iid": 12,
"root_scope_id": "4c1d8e2f-6a3b-4f90-b7c5-1e2d3c4b5a69",
"scope_id": "f8b1e068-747d-49b6-b575-06018bdd0363",
"scope_type": "group",
"status_category": "triage",
"status_id": "31c069d7-7a24-4810-a0ce-3fae095c77cf",
"title": "Draw the region map from operation density",
"uid": "d3845724-fc3b-4703-ab82-b768697f1e0e",
"updated_at": "2026-10-14T02:18:03Z",
"work_item_type": "epic",
"ancestor_group_ids": [
"4c1d8e2f-6a3b-4f90-b7c5-1e2d3c4b5a69",
"4c1d8e2f-6a3b-4f90-b7c5-1e2d3c4b5a69"
],
"ancestor_issue_uids": [
"5b2da0c2-ef0f-4851-8f24-3275a92c70e6",
"950e3c9b-0f4c-4a52-bad4-a28607bbbaa1"
],
"assignee_ids": [
"0151ad0b-5437-4be9-8e8c-316587202338",
"7d0de3f5-6a53-4117-87e9-0c092b5ddcaa"
],
"author_can_push": false,
"closed_at": "2026-10-08T18:13:25Z",
"closed_by": "a3f1c2d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
"description": "Renders each region as density contours of its operations.",
"labels": [
"labels-0a4e",
"labels-84e2"
],
"milestone_id": "4cbe7198-8bf1-4947-8a72-36ffa2dcb274",
"milestone_scope_id": "b16b8f0b-b58a-4f6c-850e-cd9fa5932c67",
"milestone_scope_type": "group",
"parent_ref": {
"iid": 49,
"scope": {
"group": "4c1d8e2f-6a3b-4f90-b7c5-1e2d3c4b5a69"
}
},
"parent_uid": "6f896fed-c1de-4229-bf3f-7d8ba0113c1c",
"points": 10,
"regressed_at": "2026-10-16T23:44:44Z",
"regressed_at_sha": "ee9ca9a8591b050759ddc2c5e9c2abf39405c57d",
"regressed_from_sha": "879da454422c3c78fe6b39987a6ed61ae460e0c4",
"regressed_run_id": "9e2b7c41-3d5a-4f8e-b1c2-7a6d5e4f3c2b",
"severity": "critical",
"type_profile": {
"blueprint_id": "dc0446da-935b-4a03-9cbd-f926cdbbe836",
"scope": {
"group": "4c1d8e2f-6a3b-4f90-b7c5-1e2d3c4b5a69"
}
},
"verification": "unverified",
"verified_at": "2026-10-14T01:29:22Z",
"verified_at_sha": "2ee3933aba3df43427558db63999116fd27972f5",
"verified_run_id": "9e2b7c41-3d5a-4f8e-b1c2-7a6d5e4f3c2b",
"version": 22
}
400Invalid requestapplication/json
Error codes
- BAD_REQUESTThe request is malformed: a parameter or a body field is not a well-formed value of its type
errorErrorBody
- The ErrorBody schema
- codestringThe coarse category, tied to the status:
NOT_FOUND,CONFLICT,INSUFFICIENT_SCOPE. Every error has one; the API reference's error catalogue lists them all. - messagestringWhat went wrong, for a person. Written to be read, not parsed: match on
reasonorcode. - fieldstring or nulloptionalOn a
400that refused one field's value, the field, as its JSON path:email,items[0].name. Put the message under that input. Absent on every other error. - reasonstring or nulloptionalThe specific code, when the error has one:
LAST_ORGANIZATION_OWNER,BRANCH_PROTECTED. The message starts with it too. Match on this when it is present, and oncodeotherwise. - required_scopestring or nulloptionalThe scope the access token was missing, on
INSUFFICIENT_SCOPE. - violationsanyoptionalPresent on the structured-validation errors (
PROVIDER_VALIDATION_FAILEDper-node,PIPELINE_VALIDATION_FAILEDDAG): a JSON array of the offending elements, so a caller can fix every one in a single round-trip. Absent (omitted) on every other error.
400 exampleSynthesized example
{
"error": {
"code": "code-1efb",
"message": "Draw the region map from operation density"
}
}
401Unauthenticated — no credential, or an invalid oneapplication/json
Error codes
- UNAUTHORIZEDNo credential was sent, or the one sent is invalid, expired or revoked
errorErrorBody
- The ErrorBody schema
- codestringThe coarse category, tied to the status:
NOT_FOUND,CONFLICT,INSUFFICIENT_SCOPE. Every error has one; the API reference's error catalogue lists them all. - messagestringWhat went wrong, for a person. Written to be read, not parsed: match on
reasonorcode. - fieldstring or nulloptionalOn a
400that refused one field's value, the field, as its JSON path:email,items[0].name. Put the message under that input. Absent on every other error. - reasonstring or nulloptionalThe specific code, when the error has one:
LAST_ORGANIZATION_OWNER,BRANCH_PROTECTED. The message starts with it too. Match on this when it is present, and oncodeotherwise. - required_scopestring or nulloptionalThe scope the access token was missing, on
INSUFFICIENT_SCOPE. - violationsanyoptionalPresent on the structured-validation errors (
PROVIDER_VALIDATION_FAILEDper-node,PIPELINE_VALIDATION_FAILEDDAG): a JSON array of the offending elements, so a caller can fix every one in a single round-trip. Absent (omitted) on every other error.
401 exampleSynthesized example
{
"error": {
"code": "code-f683",
"message": "Draw the region map from operation density"
}
}
403Caller may not file hereapplication/json
Error codes
- FORBIDDENYou are signed in but may not do this here;
reasonnames the permission or the rule that refused it - INSUFFICIENT_SCOPEThe access token lacks the scope this operation needs;
required_scopenames it - PERMISSION_REQUIREDYou need a permission you do not hold here; the message names it
errorErrorBody
- The ErrorBody schema
- codestringThe coarse category, tied to the status:
NOT_FOUND,CONFLICT,INSUFFICIENT_SCOPE. Every error has one; the API reference's error catalogue lists them all. - messagestringWhat went wrong, for a person. Written to be read, not parsed: match on
reasonorcode. - fieldstring or nulloptionalOn a
400that refused one field's value, the field, as its JSON path:email,items[0].name. Put the message under that input. Absent on every other error. - reasonstring or nulloptionalThe specific code, when the error has one:
LAST_ORGANIZATION_OWNER,BRANCH_PROTECTED. The message starts with it too. Match on this when it is present, and oncodeotherwise. - required_scopestring or nulloptionalThe scope the access token was missing, on
INSUFFICIENT_SCOPE. - violationsanyoptionalPresent on the structured-validation errors (
PROVIDER_VALIDATION_FAILEDper-node,PIPELINE_VALIDATION_FAILEDDAG): a JSON array of the offending elements, so a caller can fix every one in a single round-trip. Absent (omitted) on every other error.
403 exampleSynthesized example
{
"error": {
"code": "code-d106",
"message": "Pin a page's payload to the build that rendered it"
}
}
404Repository not foundapplication/json
Error codes
- NOT_FOUNDThe resource does not exist — or exists and you cannot see it: a private resource you have no access to answers exactly as an absent one does
errorErrorBody
- The ErrorBody schema
- codestringThe coarse category, tied to the status:
NOT_FOUND,CONFLICT,INSUFFICIENT_SCOPE. Every error has one; the API reference's error catalogue lists them all. - messagestringWhat went wrong, for a person. Written to be read, not parsed: match on
reasonorcode. - fieldstring or nulloptionalOn a
400that refused one field's value, the field, as its JSON path:email,items[0].name. Put the message under that input. Absent on every other error. - reasonstring or nulloptionalThe specific code, when the error has one:
LAST_ORGANIZATION_OWNER,BRANCH_PROTECTED. The message starts with it too. Match on this when it is present, and oncodeotherwise. - required_scopestring or nulloptionalThe scope the access token was missing, on
INSUFFICIENT_SCOPE. - violationsanyoptionalPresent on the structured-validation errors (
PROVIDER_VALIDATION_FAILEDper-node,PIPELINE_VALIDATION_FAILEDDAG): a JSON array of the offending elements, so a caller can fix every one in a single round-trip. Absent (omitted) on every other error.
404 exampleSynthesized example
{
"error": {
"code": "code-fdf3",
"message": "Label every synthesized example"
}
}
409The parent's type may not parent this typeapplication/json
Error codes
- CONFLICTThe request conflicts with the resource's current state;
reasonsays how - LEGAL_ACCEPTANCE_REQUIREDAccept the current Terms of Service before changing anything; reading stays open
errorErrorBody
- The ErrorBody schema
- codestringThe coarse category, tied to the status:
NOT_FOUND,CONFLICT,INSUFFICIENT_SCOPE. Every error has one; the API reference's error catalogue lists them all. - messagestringWhat went wrong, for a person. Written to be read, not parsed: match on
reasonorcode. - fieldstring or nulloptionalOn a
400that refused one field's value, the field, as its JSON path:email,items[0].name. Put the message under that input. Absent on every other error. - reasonstring or nulloptionalThe specific code, when the error has one:
LAST_ORGANIZATION_OWNER,BRANCH_PROTECTED. The message starts with it too. Match on this when it is present, and oncodeotherwise. - required_scopestring or nulloptionalThe scope the access token was missing, on
INSUFFICIENT_SCOPE. - violationsanyoptionalPresent on the structured-validation errors (
PROVIDER_VALIDATION_FAILEDper-node,PIPELINE_VALIDATION_FAILEDDAG): a JSON array of the offending elements, so a caller can fix every one in a single round-trip. Absent (omitted) on every other error.
409 exampleSynthesized example
{
"error": {
"code": "code-c30c",
"message": "Draw the region map from operation density"
}
}
429Open work-item limit reachedapplication/json
Error codes
- TOO_MANY_REQUESTSRetryableA quota, a rate limit or a transfer budget is spent. When the response carries
Retry-After, retry after that many seconds
errorErrorBody
- The ErrorBody schema
- codestringThe coarse category, tied to the status:
NOT_FOUND,CONFLICT,INSUFFICIENT_SCOPE. Every error has one; the API reference's error catalogue lists them all. - messagestringWhat went wrong, for a person. Written to be read, not parsed: match on
reasonorcode. - fieldstring or nulloptionalOn a
400that refused one field's value, the field, as its JSON path:email,items[0].name. Put the message under that input. Absent on every other error. - reasonstring or nulloptionalThe specific code, when the error has one:
LAST_ORGANIZATION_OWNER,BRANCH_PROTECTED. The message starts with it too. Match on this when it is present, and oncodeotherwise. - required_scopestring or nulloptionalThe scope the access token was missing, on
INSUFFICIENT_SCOPE. - violationsanyoptionalPresent on the structured-validation errors (
PROVIDER_VALIDATION_FAILEDper-node,PIPELINE_VALIDATION_FAILEDDAG): a JSON array of the offending elements, so a caller can fix every one in a single round-trip. Absent (omitted) on every other error.
429 exampleSynthesized example
{
"error": {
"code": "code-0b77",
"message": "Draw the region map from operation density"
}
}
CLI
gitmoap issues create
- --repo-ididRepository ID (id or owner/repo path)
- --assignee-idsjsonoptional
- --descriptionstringoptional
- --labelsjsonoptional
- --milestone-idstringoptional
- --parent-refjsonoptional
- --pointsnumberoptional
- --severitycritical | high | medium | lowoptional
- --status-idstringoptional
- --titlestring
- --type-profilejsonoptional
- --work-item-typeepic | story | bug | task | spike | chore | incident | sub_taskoptional