Docs
Search docs

Get a pull request's diff

GET/api/repos/{owner}/{repo}/pulls/{number}/diff

getPullRequestDiff

Unified diff of what the pull request introduces: a three-dot diff from the merge base of the target branch and the PR head, so commits the target branch gained after the PR was cut do not appear as reverts. Returns an empty file list (with `base_commit`/`head_commit` zeroed) when there is nothing to diff yet — a PR whose source branch has not been pushed, or one whose head is not present in this repository's object store (an open fork PR, whose objects are only imported at merge time). Subject to the same per-file and total-size caps as the commit diff endpoint; check `truncated`. Pass `patch=false` for a stat-only answer: the same response with every file's `patch` omitted, for a caller that renders a summary and would discard the hunks. It is a projection, not a cheaper computation — `stats`, `truncated` and the per-file counts are identical to the full response, and the server does the same work.

Authentication is not described for this operation in the spec — that does not mean it is public. Check tokens and scopes.

curl

curl -X GET 'https://neosource.dev/api/repos/OWNER/REPO/pulls/NUMBER/diff'

fetch

fetch("https://neosource.dev/api/repos/OWNER/REPO/pulls/NUMBER/diff", {
  method: "GET",
});

Path parameters

ownerrequired

Repository owner or organization slug.

string

reporequired

Repository name.

string

numberrequired

Change request number.

integerint32

Query parameters

patch

Include each file's unified-diff text. Absent means `true` — today's behaviour — and only absence defaults: a value that is not a bool is a 400 rather than a silent full response.

boolean

Responses

200Diff result

application/json

DiffResponse

object

base_commitrequired

string

filesrequired

array

items

DiffFileResponse

object

additions

integer | null

Added lines in this file, or `null` when the file was never line-counted: it is binary, or one side exceeds the per-file byte ceiling. `null` and `0` mean different things and must not be conflated — `0` is "changed, but no lines changed" (an empty file added or deleted, a mode-only change), which is a fact about the file, while `null` is a fact about the diff. Uncounted files contribute nothing to `DiffStatsResponse`, so the per-file counts sum to the aggregate over exactly the counted ones.

deletions

integer | null

Removed lines in this file. See [`DiffFileResponse::additions`].

is_binaryrequired

boolean

new_oid

string | null

old_oid

string | null

patch

string | null

Unified diff text for this file. Omitted for binary files.

pathrequired

string

statusrequired
DiffFileStatus
too_largerequired

boolean

`true` when one side of this file exceeds the per-file byte ceiling, so no diff was computed at all. Stated rather than implied. The absence of `patch` alone does not mean this — an empty file added or deleted, and a mode-only change, both have no patch text and were genuinely counted — so a client that inferred "too large" from a missing patch told the reader "no textual changes" about a file it had simply refused to read (issue #557). `is_binary` takes precedence: a binary blob over the ceiling reports `is_binary: true, too_large: false`, because binary is the more specific reason and is decided first.

head_commitrequired

string

statsrequired

DiffStatsResponse

object

additionsrequired

integer

deletionsrequired

integer

files_changedrequired

integer

truncatedrequired

boolean

`true` when the file list was capped by a response-size guard (total patch bytes or file count). `stats` still reflects the full diff; `files` carries only the retained prefix. Mirrors `BlobResponse.truncated` — honest truncation over a silent partial diff.

Standard errors

Bodies documented once for the whole API — see standard errors.

  • 400Bad Request — one of: invalid_input
  • 403Forbidden — one of: forbidden
  • 404Not Found — one of: not_found
  • 423Locked — one of: busy
  • 429Rate limited — retry after the interval in the `Retry-After` header
  • 500Internal server error
  • 503Service temporarily unavailable / at capacity — retry after the `Retry-After` header
  • 504Gateway timeout — the request exceeded the server's handling budget

Schemas

Referenced above. Listed here rather than expanded inline, so the same definition is not repeated at every level.

DiffFileStatus

string

"added""modified""deleted"