Skip to content

Create an issue

POST
/v1/issues
curl --request POST \
--url https://api.pealboard.com/v1/issues \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{ "repositoryId": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "title": "example", "body": "example", "labels": [ "example" ], "assignees": [ "example" ], "milestoneId": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "issueType": "example", "project": { "projectId": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "fieldValues": { "additionalProperty": { "optionId": "example", "optionName": "example", "text": "example", "number": 1, "date": "2026-04-15", "iterationId": "example", "optionIds": [ "example" ] } } } }'

Creates the issue in GitHub, then caches it. Labels that the repository does not have are created first, because GitHub silently drops an unknown label rather than refusing — which would leave an issue missing the label a workflow depends on.

Send Idempotency-Key to make a retry return the first answer rather than creating a second issue.

Access. Requires the member role or above (member, admin, owner). Creating an issue writes to the customer’s GitHub repository under their installation. API-key scope: issues:write.

Media typeapplication/json
object
repositoryId
required

From GET /v1/github/repositories.

string format: uuid
title
required
string
>= 1 characters <= 256 characters
body
string
<= 65536 characters
labels

Created in the repository if missing.

Array<string>
assignees

GitHub logins. GitHub drops anybody without access to the repository.

Array<string>
milestoneId

A UUID this API issued.

string format: uuid
issueType

An organization issue type by name, when the organization uses them.

string
project
object
projectId
required

A UUID this API issued.

string format: uuid
fieldValues

Keyed by field node id. Set after the issue joins the project.

object
key
additional properties

Send exactly one key. Send null in place of the whole object to clear the field. Assignees, Labels, Milestone and Repository cannot be set this way — GitHub requires those to be changed on the issue itself.

object
optionId

A single-select option id.

string
optionName

A single-select option by name, matched case-insensitively.

string
text
string
number
number
date

YYYY-MM-DD.

string format: date
iterationId
string
optionIds

A multi-select field’s options.

Array<string>
Examplegenerated
{
"repositoryId": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0",
"title": "example",
"body": "example",
"labels": [
"example"
],
"assignees": [
"example"
],
"milestoneId": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0",
"issueType": "example",
"project": {
"projectId": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0",
"fieldValues": {
"additionalProperty": {
"optionId": "example",
"optionName": "example",
"text": "example",
"number": 1,
"date": "2026-04-15",
"iterationId": "example",
"optionIds": [
"example"
]
}
}
}
}

The issue.

Media typeapplication/json
object
id
required

A UUID this API issued.

string format: uuid
nodeId
required
string
number
required
number
title
required
string
body
required
string | null
state
required

GitHub’s own word for whether the issue is open or closed.

string
Allowed values: open closed
stateReason
required

Why the issue is in this state. Null while it is open. duplicate is what makes a portal show a request as Merged.

string | null
Allowed values: completed not_planned duplicate reopened
repository
required
object
id
required

A UUID this API issued.

string format: uuid
nodeId
required
string
fullName
required
string
ownerLogin
required
string
name
required
string
private
required
boolean
author
required
object
id
required

GitHub’s numeric user id.

number
login
required
string
avatarUrl
required
string | null format: uri
type
required

User, Bot or Organization.

string
assignees
required
Array<object | null>
object
id
required

GitHub’s numeric user id.

number
login
required
string
avatarUrl
required
string | null format: uri
type
required

User, Bot or Organization.

string
labels
required
Array<object>
object
nodeId
required
string
name
required
string
color
required
string
milestone
required
object
id
required

A UUID this API issued.

string format: uuid
nodeId
required
string
repositoryId
required

A UUID this API issued.

string format: uuid
number
required
number
title
required
string
description
required
string | null
state
required
string
Allowed values: open closed
dueOn
required
string | null format: date-time
issueType
required

The organization issue type, when the organization uses them.

object
id
required
number
nodeId
required
string
name
required
string
color
required
string | null
subIssues
required
object
total
required
number
completed
required
number
percentCompleted
required
number
projectItems
required
Array<object>
object
itemNodeId
required

Pass this to the project item routes.

string
projectId
required

A UUID this API issued.

string format: uuid
projectNodeId
required
string
projectTitle
required
string
fieldValues
required

Keyed by the field’s node id, which is what GitHub identifies it by.

object
key
additional properties
One of:
object
type
required
string
Allowed values: text
text
required
string
requests
required

Empty for an issue no portal knows about, which is most of them.

Array<object>

A portal request that points at this issue. One issue maps to at most one request per portal.

object
id
required

A UUID this API issued.

string format: uuid
portalId
required

A UUID this API issued.

string format: uuid
portalSlug
required

Lowercase letters, digits and hyphens.

string
>= 2 characters <= 40 characters /^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/
portalName
required
string
number
required

The portal-local request number.

string
visibility
required
string
Allowed values: private company public
voteCount
required
number
commentsCount
required
number
locked
required
boolean
htmlUrl
required

The issue on GitHub.

string format: uri
createdAt
required
string format: date-time
updatedAt
required
string format: date-time
closedAt
required
string | null format: date-time
syncedAt
required

When Pealboard last read this issue from GitHub.

string format: date-time
Example
{
"id": "8f1c2b3e-0a4d-4e6f-9c11-2d3e4f5a6b7c",
"nodeId": "I_kwDOAbc123",
"number": 412,
"title": "Board columns lose their order after a drag",
"body": "Dragging a card to the last column reorders every other column.",
"state": "open",
"stateReason": null,
"repository": {
"id": "1b2c3d4e-5f60-4718-8293-a4b5c6d7e8f9",
"nodeId": "R_kgDOAbc123",
"fullName": "mersoft-corp/pealboard-api",
"ownerLogin": "mersoft-corp",
"name": "pealboard-api",
"private": false
},
"author": {
"id": 4891,
"login": "jdoe",
"avatarUrl": null,
"type": "User"
},
"assignees": [
{
"id": 5120,
"login": "asmith",
"avatarUrl": null,
"type": "User"
}
],
"labels": [
{
"nodeId": "LA_kwDOAbc",
"name": "bug",
"color": "d73a4a"
}
],
"milestone": null,
"issueType": null,
"subIssues": null,
"projectItems": [],
"requests": [],
"commentsCount": 3,
"locked": false,
"htmlUrl": "https://github.com/mersoft-corp/pealboard-api/issues/412",
"createdAt": "2026-09-01T09:14:00.000Z",
"updatedAt": "2026-09-08T16:02:11.000Z",
"closedAt": null,
"syncedAt": "2026-09-08T16:02:14.000Z"
}

No valid credentials.

Media typeapplication/json
object
error
required
object
code
required

A stable identifier for the kind of failure. Safe to branch on.

string
message
required

What went wrong, written for a person.

string
detail

Structured particulars, when there are any.

object
key
additional properties
remedy

What to do about it, when there is something to do.

string
requestId
required

Quote this when asking about a specific failure.

string
Examplegenerated
{
"error": {
"code": "example",
"message": "example",
"detail": {
"additionalProperty": "example"
},
"remedy": "example",
"requestId": "example"
}
}

Authenticated, but not permitted.

Media typeapplication/json
object
error
required
object
code
required

A stable identifier for the kind of failure. Safe to branch on.

string
message
required

What went wrong, written for a person.

string
detail

Structured particulars, when there are any.

object
key
additional properties
remedy

What to do about it, when there is something to do.

string
requestId
required

Quote this when asking about a specific failure.

string
Examplegenerated
{
"error": {
"code": "example",
"message": "example",
"detail": {
"additionalProperty": "example"
},
"remedy": "example",
"requestId": "example"
}
}

No such resource, or it is not visible to you.

Media typeapplication/json
object
error
required
object
code
required

A stable identifier for the kind of failure. Safe to branch on.

string
message
required

What went wrong, written for a person.

string
detail

Structured particulars, when there are any.

object
key
additional properties
remedy

What to do about it, when there is something to do.

string
requestId
required

Quote this when asking about a specific failure.

string
Examplegenerated
{
"error": {
"code": "example",
"message": "example",
"detail": {
"additionalProperty": "example"
},
"remedy": "example",
"requestId": "example"
}
}

The request conflicts with the current state.

Media typeapplication/json
object
error
required
object
code
required

A stable identifier for the kind of failure. Safe to branch on.

string
message
required

What went wrong, written for a person.

string
detail

Structured particulars, when there are any.

object
key
additional properties
remedy

What to do about it, when there is something to do.

string
requestId
required

Quote this when asking about a specific failure.

string
Examplegenerated
{
"error": {
"code": "example",
"message": "example",
"detail": {
"additionalProperty": "example"
},
"remedy": "example",
"requestId": "example"
}
}

The request did not match the expected shape.

Media typeapplication/json
object
error
required
object
code
required

A stable identifier for the kind of failure. Safe to branch on.

string
message
required

What went wrong, written for a person.

string
detail

Structured particulars, when there are any.

object
key
additional properties
remedy

What to do about it, when there is something to do.

string
requestId
required

Quote this when asking about a specific failure.

string
Examplegenerated
{
"error": {
"code": "example",
"message": "example",
"detail": {
"additionalProperty": "example"
},
"remedy": "example",
"requestId": "example"
}
}

Rate limited. Retry after the interval in the header.

Media typeapplication/json
object
error
required
object
code
required

A stable identifier for the kind of failure. Safe to branch on.

string
message
required

What went wrong, written for a person.

string
detail

Structured particulars, when there are any.

object
key
additional properties
remedy

What to do about it, when there is something to do.

string
requestId
required

Quote this when asking about a specific failure.

string
Examplegenerated
{
"error": {
"code": "example",
"message": "example",
"detail": {
"additionalProperty": "example"
},
"remedy": "example",
"requestId": "example"
}
}

GitHub or another dependency refused or did not answer. Nothing in the workspace changed.

Media typeapplication/json
object
error
required
object
code
required

A stable identifier for the kind of failure. Safe to branch on.

string
message
required

What went wrong, written for a person.

string
detail

Structured particulars, when there are any.

object
key
additional properties
remedy

What to do about it, when there is something to do.

string
requestId
required

Quote this when asking about a specific failure.

string
Examplegenerated
{
"error": {
"code": "example",
"message": "example",
"detail": {
"additionalProperty": "example"
},
"remedy": "example",
"requestId": "example"
}
}