Skip to content

Edit up to fifty issues

POST
/v1/issues/bulk
curl --request POST \
--url https://api.pealboard.com/v1/issues/bulk \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{ "issueIds": [ "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0" ], "change": { "labels": [ "example" ], "assignees": [ "example" ], "milestoneId": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "state": "open", "stateReason": "completed", "field": { "projectId": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "fieldNodeId": "example", "value": { "optionId": "example", "optionName": "example", "text": "example", "number": 1, "date": "2026-04-15", "iterationId": "example", "optionIds": [ "example" ] } } } }'

Applies one change to every issue named. Each issue is a separate GitHub write, serialised through the workspace’s installation limiter so a bulk edit cannot race itself into a secondary rate limit.

Partial success is the normal outcome and is reported as a 200. The response lists every id with what happened to it; an issue in an archived repository or one GitHub refused fails on its own without stopping the rest. Read results, not the status code.

Access. Requires the member role or above (member, admin, owner). Editing many issues at once is editing issues, and is held to the same role. API-key scope: issues:write.

Media typeapplication/json
object
issueIds
required

At most fifty, because each one is a GitHub write.

Array<string>
>= 1 items <= 50 items
change
required

Send exactly one kind of change.

object
labels

Replaces the label set on every issue named.

Array<string>
assignees

Replaces the assignees. GitHub drops anybody without repository access.

Array<string>
milestoneId

Null clears the milestone. A milestone belongs to one repository.

string | null format: uuid
state

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

string
Allowed values: open closed
stateReason

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

string
Allowed values: completed not_planned duplicate reopened
field

Sets one project field on every issue that is an item of that project.

object
projectId
required

A UUID this API issued.

string format: uuid
fieldNodeId
required
string
value
required

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>

What happened to each issue.

Media typeapplication/json
object
results
required
Array<object>
object
issueId
required

A UUID this API issued.

string format: uuid
ok
required
boolean
error
required

Null when it succeeded.

object
code
required
string
message
required
string
succeeded
required
number
failed
required
number
Examplegenerated
{
"results": [
{
"issueId": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0",
"ok": true,
"error": {
"code": "example",
"message": "example"
}
}
],
"succeeded": 1,
"failed": 1
}

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"
}
}