Skip to content

List issues across every repository

GET
/v1/issues
curl --request GET \
--url 'https://api.pealboard.com/v1/issues?cursor=MDAwMS0y&limit=50&q=board%20columns%20-duplicate&state=open&updated_since=-7d&sort=updated&sortField=PVTF_lADOBw8Xnc4AbcDzOAK1&order=asc' \
--header 'Authorization: Bearer <token>'

Issues from every synced repository in the workspace, from Pealboard’s cache of GitHub. No GitHub request is made.

A project field is filtered on with a parameter named field:<fieldNodeId>, whose value is the value the field must hold, or none for a field that is not set. Field node ids come from GET /v1/projects/{projectId}. For example, ?field:PVTSSF_lADO...=In progress.

The value matches the word on the card, and also an option id or an iteration id for a caller that already asked GitHub. A number is compared as a number, so 3 matches a stored 3.0. Five operators are written into the value, because the parameter’s name is already the field’s node id: ?field:PVTF_x=>=3, ?field:PVTF_x=<2026-10-01, ?field:PVTF_x=2026-09-01..2026-09-30. A comparison operand has to be a number or a date as YYYY-MM-DD. A date comparison also matches an iteration, by its start date.

Ordering is by the sort key and then by id, so a cursor never repeats or skips a row.

Carries a weak ETag. Send it back as If-None-Match and an unchanged answer is a 304 with no body.

Access. Requires the viewer role or above (viewer, member, admin, owner). Every member reads the issues of the repositories their workspace has connected. API-key scope: issues:read.

cursor

The nextCursor from the previous page, unchanged. Omit it to start at the beginning.

string
Example
MDAwMS0y

The nextCursor from the previous page, unchanged. Omit it to start at the beginning.

limit

How many rows to return. At most 100.

integer
default: 50 >= 1 <= 100

How many rows to return. At most 100.

q

Full text across every synced repository, over title, issue number, label names and body. Accepts what a person types, including quoted phrases, or, and a leading - to exclude.

string
Example
board columns -duplicate

Full text across every synced repository, over title, issue number, label names and body. Accepts what a person types, including quoted phrases, or, and a leading - to exclude.

repository
Any of:
string

A repository id from GET /v1/github/repositories. Repeat for several.

state

Defaults to every state.

string
Allowed values: open closed all

Defaults to every state.

label
Any of:
string

A label name. Repeat for several; an issue must carry every one.

assignee
Any of:
string

A GitHub login, @me for the calling person, or none for unassigned. Repeat for several; any of them matches.

milestone
Any of:
string

A milestone id, or none. Repeat for several.

project
Any of:
string

A project id from GET /v1/projects. Repeat for several.

type
Any of:
string

An issue type name, or none. Repeat for several.

updated_since

An ISO 8601 instant, or a window such as -7d, -24h, -2w.

string
Example
-7d

An ISO 8601 instant, or a window such as -7d, -24h, -2w.

sort

field orders by a project field and needs sortField. Everything else is a column on the issue.

string
Allowed values: updated created number title comments field

field orders by a project field and needs sortField. Everything else is a column on the issue.

sortField

The project field’s node id, when sort is field. From GET /v1/projects/{projectId}. A number sorts numerically, a date and an iteration chronologically, a single select in the project’s own option order, and a text field alphabetically. An issue with no value for the field sorts last, whichever direction is asked for.

string
Example
PVTF_lADOBw8Xnc4AbcDzOAK1

The project field’s node id, when sort is field. From GET /v1/projects/{projectId}. A number sorts numerically, a date and an iteration chronologically, a single select in the project’s own option order, and a text field alphabetically. An issue with no value for the field sorts last, whichever direction is asked for.

order
string
Allowed values: asc desc

One page of issues.

Media typeapplication/json
object
data
required
Array<object>
object
id
required

A UUID this API issued.

string format: uuid
nodeId
required
string
number
required
number
title
required
string
body
required

What the person typed. The attribution block Pealboard writes for a portal request or for a member, and the hidden marker beside it, are stripped here and kept on GitHub. Sending an edited body back keeps them.

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
duplicateOfIssueId
required

The issue this one was closed as a duplicate of, when the close went through Pealboard with duplicateOfIssueId. GitHub takes the canonical issue and never sends it back, so a duplicate closed on GitHub itself is stateReason: duplicate with null here. Cleared on reopen.

string | null format: uuid
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
authoredBy
required
object
membershipId
required

A UUID this API issued.

string | null format: uuid
name
required

The display name. Never an email address.

string
kind
required

team: a workspace member, the same word a portal uses for the same people. customer: a portal customer, whose request or comment the App wrote on their behalf; membershipId is null.

string
Allowed values: team customer
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
parent
required

The issue this one was split out of, when it is a sub-issue. The children are GET /v1/issues/{issueId}/sub-issues.

object
id
required

Null when the parent’s repository is not synced, so Pealboard holds no row for it.

string | null format: uuid
number
required
integer
repository
required
object
id
required

A UUID this API issued.

string | null format: uuid
fullName
required
string
title
required
string | null
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
nextCursor
required

Pass this back as cursor for the next page. Null on the last page.

string | null
Example
{
"data": [
{
"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,
"duplicateOfIssueId": 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"
},
"authoredBy": null,
"assignees": [
{
"id": 5120,
"login": "asmith",
"avatarUrl": null,
"type": "User"
}
],
"labels": [
{
"nodeId": "LA_kwDOAbc",
"name": "bug",
"color": "d73a4a"
}
],
"milestone": null,
"issueType": null,
"subIssues": null,
"parent": 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"
}
]
}

Unchanged since the ETag the caller sent as If-None-Match. No body.

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