Summary
When calling getDevStatusDetail (or the equivalent doRequest + makeDevStatusUri with dataType: 'pullrequest'), the reviewers[].approved boolean returned by the Jira dev-status API is a cached/stale snapshot of GitHub Enterprise review state. It does not reflect real-time approvals, and there appears to be no way to force a refresh or access live review state through any available API path.
Actual API Response (getDevStatusDetail — dataType: 'pullrequest')
This is the real response returned by Jira Server/DC. At the time of this call, 2 of the 7 reviewers had already approved the PR on GitHub Enterprise. The API returns "approved": false for all of them:
{
"errors": [],
"detail": [
{
"branches": [
{
"name": "fix/PROJ-123-my-feature-branch",
"url": "https://ghe.example.com/my-org/my-repo/tree/fix%2FPROJ-123-my-feature-branch",
"createPullRequestUrl": "https://ghe.example.com/my-org/my-repo/compare",
"repository": {
"name": "my-repo",
"url": "https://ghe.example.com/my-org/my-repo"
}
}
],
"pullRequests": [
{
"author": {
"name": "alice-reviewer",
"avatar": "https://example.com/avatar.png"
},
"id": "#631",
"name": "PROJ-123 - My feature description",
"commentCount": 0,
"source": {
"branch": "fix/PROJ-123-my-feature-branch",
"url": "https://ghe.example.com/my-org/my-repo/tree/fix%2FPROJ-123-my-feature-branch"
},
"destination": {
"branch": "master",
"url": "https://ghe.example.com/my-org/my-repo/tree/master"
},
"reviewers": [
{ "name": "bob-reviewer", "avatar": "https://example.com/avatar.png", "approved": false },
{ "name": "carol-reviewer", "avatar": "https://example.com/avatar.png", "approved": false },
{ "name": "dave-reviewer", "avatar": "https://example.com/avatar.png", "approved": false },
{ "name": "eve-reviewer", "avatar": "https://example.com/avatar.png", "approved": false },
{ "name": "frank-reviewer", "avatar": "https://example.com/avatar.png", "approved": false },
{ "name": "alice-reviewer", "avatar": "https://example.com/avatar.png", "approved": false },
{ "name": "grace-reviewer", "avatar": "https://example.com/avatar.png", "approved": false }
],
"status": "OPEN",
"url": "https://ghe.example.com/my-org/my-repo/pull/631",
"lastUpdate": "2026-04-02T16:33:23.000+0900"
}
],
"repositories": [],
"_instance": {
"singleInstance": true,
"baseUrl": "https://github.com",
"name": "GitHub Enterprise",
"typeName": "GitHub Enterprise",
"id": "githube",
"type": "githube"
}
}
]
}
Key observations:
- All 7
reviewers[].approved values are false — despite 2 reviewers having approved on GHE
"lastUpdate": "2026-04-02T16:33:23.000+0900" — this matches the date the branch/PR was linked, not when approvals were given (approvals came after)
_instance.baseUrl shows "https://github.com" (GitHub Cloud) even though this is a GitHub Enterprise instance — a separate minor inaccuracy in the data
- The
reviewer object has only 3 fields: name, avatar, approved — no state field (e.g. APPROVED, CHANGES_REQUESTED, DISMISSED) that the GHE API provides
Note to maintainers: This sample was captured from a production Jira Data Center 9.x instance with GitHub Enterprise 3.15 integration. Names and URLs have been anonymized.
Additionally, dataType: 'review' — which would be the natural extension to fetch code-review data — is unsupported on Jira Server/DC, returning:
{ "errors": [{ "error": "java.lang.IllegalArgumentException: Unsupported type: review" }] }
Environment
- jira-client version:
8.2.2
- Jira type: Server / Data Center (self-hosted)
- GHE integration: GitHub Enterprise (applicationType:
githube)
Reproduction
// Returns PR with reviewer list — BUT approved is always false even when GHE shows approvals
const resp = await jira.getDevStatusDetail(issueId, 'githube', 'pullrequest')
// resp.detail[0].pullRequests[0].reviewers
// → [{ name: 'alice', approved: false }, { name: 'bob', approved: false }]
// ... even though alice and bob have both approved the PR on GitHub Enterprise
// Attempting to use dataType=review throws an error
await jira.doRequest(jira.makeRequestHeader(jira.makeDevStatusUri({
pathname: '/detail',
intermediatePath: '/rest/dev-status/1.0/issue',
query: { issueId, applicationType: 'githube', dataType: 'review' }
})))
// → { errors: [{ error: 'java.lang.IllegalArgumentException: Unsupported type: review' }] }
What I tested (all return identical stale data)
| Variant |
Result |
/rest/dev-status/1.0/issue/detail |
approved: false (stale) |
/rest/dev-status/latest/issue/detail |
approved: false (stale) |
+ forceRefresh=true |
approved: false (stale) |
+ showApprovals=true |
approved: false (stale) |
dataType=review |
❌ Unsupported type: review |
dataType=build/deployment/commit |
detail: [] (empty) |
summary + forceRecalculate=true |
Returns PR count/state — no reviewer data at all |
I also checked every other available mechanism — findIssue with all expand values, getIssueChangelog, getRemoteLinks, /issue/{key}/properties, Agile getIssue(expand=pullRequests), /rest/gitplugin/1.0, /rest/jira/1.0/issue/.../pullRequests — none return reviewer approval state from GitHub Enterprise.
Questions / Feature Request
-
Is reviewer.approved intentionally a cached/point-in-time snapshot? The Jira dev-status API appears to index reviewer state asynchronously and can lag hours or days. Is this a known Jira limitation on Server/DC, or is there an API call that forces a real-time sync?
-
Is dataType=review planned for Server/DC? It's listed as a valid dataType in some Jira Cloud API docs but throws Unsupported type on Server 9.x / DC. Would it be feasible to add a getDevStatusReview helper (similar to getDevStatusDetail) that gracefully falls back when the endpoint is unavailable?
-
Would a helper that wraps the GHE /api/v3/repos/:owner/:repo/pulls/:number/reviews endpoint be in scope? When applicationType=githube, the PR URL is available in the dev-status detail response. A getGHEPullRequestReviews(prUrl, gheToken) helper using the GHE REST API would provide real-time review state without requiring users to implement the HTTP call themselves.
Workaround (for others who hit this)
The only way to get live review state on Jira Server/DC with a githube integration is to call the GitHub Enterprise API directly:
GET https://<ghe-host>/api/v3/repos/:owner/:repo/pulls/:number/reviews
Authorization: token <GHE_PAT>
The PR URL (and therefore owner, repo, number) is available in getDevStatusDetail response under detail[0].pullRequests[0].url.
Tested on jira-client v8.2.2, Node.js v25.6.1, Jira Data Center 9.x, GitHub Enterprise Server 3.15
Summary
When calling
getDevStatusDetail(or the equivalentdoRequest+makeDevStatusUriwithdataType: 'pullrequest'), thereviewers[].approvedboolean returned by the Jira dev-status API is a cached/stale snapshot of GitHub Enterprise review state. It does not reflect real-time approvals, and there appears to be no way to force a refresh or access live review state through any available API path.Actual API Response (
getDevStatusDetail—dataType: 'pullrequest')This is the real response returned by Jira Server/DC. At the time of this call, 2 of the 7 reviewers had already approved the PR on GitHub Enterprise. The API returns
"approved": falsefor all of them:{ "errors": [], "detail": [ { "branches": [ { "name": "fix/PROJ-123-my-feature-branch", "url": "https://ghe.example.com/my-org/my-repo/tree/fix%2FPROJ-123-my-feature-branch", "createPullRequestUrl": "https://ghe.example.com/my-org/my-repo/compare", "repository": { "name": "my-repo", "url": "https://ghe.example.com/my-org/my-repo" } } ], "pullRequests": [ { "author": { "name": "alice-reviewer", "avatar": "https://example.com/avatar.png" }, "id": "#631", "name": "PROJ-123 - My feature description", "commentCount": 0, "source": { "branch": "fix/PROJ-123-my-feature-branch", "url": "https://ghe.example.com/my-org/my-repo/tree/fix%2FPROJ-123-my-feature-branch" }, "destination": { "branch": "master", "url": "https://ghe.example.com/my-org/my-repo/tree/master" }, "reviewers": [ { "name": "bob-reviewer", "avatar": "https://example.com/avatar.png", "approved": false }, { "name": "carol-reviewer", "avatar": "https://example.com/avatar.png", "approved": false }, { "name": "dave-reviewer", "avatar": "https://example.com/avatar.png", "approved": false }, { "name": "eve-reviewer", "avatar": "https://example.com/avatar.png", "approved": false }, { "name": "frank-reviewer", "avatar": "https://example.com/avatar.png", "approved": false }, { "name": "alice-reviewer", "avatar": "https://example.com/avatar.png", "approved": false }, { "name": "grace-reviewer", "avatar": "https://example.com/avatar.png", "approved": false } ], "status": "OPEN", "url": "https://ghe.example.com/my-org/my-repo/pull/631", "lastUpdate": "2026-04-02T16:33:23.000+0900" } ], "repositories": [], "_instance": { "singleInstance": true, "baseUrl": "https://github.com", "name": "GitHub Enterprise", "typeName": "GitHub Enterprise", "id": "githube", "type": "githube" } } ] }Key observations:
reviewers[].approvedvalues arefalse— despite 2 reviewers having approved on GHE"lastUpdate": "2026-04-02T16:33:23.000+0900"— this matches the date the branch/PR was linked, not when approvals were given (approvals came after)_instance.baseUrlshows"https://github.com"(GitHub Cloud) even though this is a GitHub Enterprise instance — a separate minor inaccuracy in the datareviewerobject has only 3 fields:name,avatar,approved— nostatefield (e.g.APPROVED,CHANGES_REQUESTED,DISMISSED) that the GHE API providesAdditionally,
dataType: 'review'— which would be the natural extension to fetch code-review data — is unsupported on Jira Server/DC, returning:{ "errors": [{ "error": "java.lang.IllegalArgumentException: Unsupported type: review" }] }Environment
8.2.2githube)Reproduction
What I tested (all return identical stale data)
/rest/dev-status/1.0/issue/detailapproved: false(stale)/rest/dev-status/latest/issue/detailapproved: false(stale)+ forceRefresh=trueapproved: false(stale)+ showApprovals=trueapproved: false(stale)dataType=reviewUnsupported type: reviewdataType=build/deployment/commitdetail: [](empty)summary + forceRecalculate=trueI also checked every other available mechanism —
findIssuewith all expand values,getIssueChangelog,getRemoteLinks,/issue/{key}/properties, AgilegetIssue(expand=pullRequests),/rest/gitplugin/1.0,/rest/jira/1.0/issue/.../pullRequests— none return reviewer approval state from GitHub Enterprise.Questions / Feature Request
Is
reviewer.approvedintentionally a cached/point-in-time snapshot? The Jira dev-status API appears to index reviewer state asynchronously and can lag hours or days. Is this a known Jira limitation on Server/DC, or is there an API call that forces a real-time sync?Is
dataType=reviewplanned for Server/DC? It's listed as a validdataTypein some Jira Cloud API docs but throwsUnsupported typeon Server 9.x / DC. Would it be feasible to add agetDevStatusReviewhelper (similar togetDevStatusDetail) that gracefully falls back when the endpoint is unavailable?Would a helper that wraps the GHE
/api/v3/repos/:owner/:repo/pulls/:number/reviewsendpoint be in scope? WhenapplicationType=githube, the PR URL is available in the dev-status detail response. AgetGHEPullRequestReviews(prUrl, gheToken)helper using the GHE REST API would provide real-time review state without requiring users to implement the HTTP call themselves.Workaround (for others who hit this)
The only way to get live review state on Jira Server/DC with a
githubeintegration is to call the GitHub Enterprise API directly:The PR URL (and therefore
owner,repo,number) is available ingetDevStatusDetailresponse underdetail[0].pullRequests[0].url.Tested on jira-client v8.2.2, Node.js v25.6.1, Jira Data Center 9.x, GitHub Enterprise Server 3.15