Docs
Search docs

List commit history

GET/api/repos/{owner}/{repo}/commits

listRepositoryCommits

Returns a paginated commit log walking from the selected bookmark. Raw commit cursors must be reachable from the selected repository.

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/commits'

fetch

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

Path parameters

ownerrequired

Repository owner or organization slug.

string

reporequired

Repository name.

string

Query parameters

ref

Bookmark name to walk from. Defaults to the repository default branch.

string

per_page

Number of commits per page (max 100, default 30).

integerint32

after

Commit OID to start listing after (exclusive cursor for pagination). Must be reachable from the selected repository.

string

author

Filter to commits whose author name or email contains this string (case-insensitive). Applied along the branch-scoped walk.

string

since

Only commits authored at/after this RFC3339 timestamp.

string

until

Only commits authored at/before this RFC3339 timestamp.

string

Responses

200Commit list

application/json

CommitListResponse

object

commitsrequired

array

items

CommitResponse

object

author_account
one of
checks
committerrequired
CommitSignatureResponse
committer_account
one of
messagerequired

string

oidrequired

string

parentsrequired

array

items

string

pull_request
treerequired

string

has_morerequired

boolean

next_cursor

string | null

Explicit cursor to pass as `after` for the next page (the deepest commit walked). Present when `has_more`. Absent → use the last commit's `oid` (back-compat for the unfiltered path).

searched

integer | nullint32

Commits examined to produce this page — present only when a filter is active, so the UI can show "searched N commits".

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.

CommitSignatureResponse

object

emailrequired

string

namerequired

string

timestamprequired

integerint64

AuthorRef

object

A commit author/committer resolved to a platform account, matched at read time on a **verified** email. `None` when the commit's email is not a verified account (imported history, an unverified address, a bot) — the raw `name`/`email` on the signature is still rendered, as GitHub does.

account_idrequired

string

avatar_url

string | null

The account's uploaded avatar on the content origin, minted like `UserResponse::avatar_url`; absent when it has none, so the SPA paints the generated fallback without probing `/avatars/{handle}` first.

display_namerequired

string

emailrequired

string

handlerequired

string

CommitChecksSummary

object

Rollup of everything that checked a commit: workflow runs it triggered plus external statuses posted against it. `state` follows [`CommitStatusState::rollup`] — `failure` if anything failed, `pending` while anything is still in flight, `success` only when all green. The counts and `state` are PER RUN: every run on the commit, a re-run's superseded earlier attempts included, so a failed attempt re-run green still counts as failed here. `workflows` is the newest attempt of each workflow and can therefore disagree with them; a row's colours come from `workflows` + `statuses` alone.

failedrequired

integerint64

pendingrequired

integerint64

Includes `superseded`.

staterequired

CommitStatusState

string

State of a single commit status, GitHub-shaped. `Error` is distinct from `Failure` on individual statuses (infrastructure/tooling breakage vs. a real red result) but the combined rollup folds both into `Failure`.

"pending""success""failure""error"

statuses
one of
  • CommitStatusesSummary

    object

    The external commit statuses on one commit, rolled up as a single entry.

    staterequired

    CommitStatusState

    string

    State of a single commit status, GitHub-shaped. `Error` is distinct from `Failure` on individual statuses (infrastructure/tooling breakage vs. a real red result) but the combined rollup folds both into `Failure`.

    "pending""success""failure""error"

    totalrequired

    integerint64

  • null

succeededrequired

integerint64

supersededrequired

integerint64

Runs the merge queue superseded and cancelled (ADR 0160): they roll `state` up as `pending` (never green, never red) and are a SUBSET of `pending` (`superseded <= pending`) — the ones that will not resolve on their own.

totalrequired

integerint64

workflowsrequired

array

The same runs split by workflow: each workflow's newest run (latest attempt) on this commit, in row order (by path, then id). What a commit row paints one icon per; the counts above stay the roll-up.

items

WorkflowCheck

object

One workflow's newest run on a commit — one icon of a commit or PR row, beside the workflow's siblings, where a single roll-up would hide which workflow was red (`WorkflowVerdict` in neosource-core). Rows receive these already ordered: by `workflow_path`, then `workflow_id`, an unregistered workflow last — never by state.

run_idrequired

string

The newest run (latest attempt) of this workflow on the commit (UUID).

run_numberrequired

integerint64

skippedrequired

boolean

Every job of the run was skipped: `status` is `succeeded`, but no work ran.

statusrequired

WorkflowRunStatus

string

Lifecycle of a workflow run. Mirrors the GHA-shaped surface that the SPA renders. The serde `snake_case` strings are the wire vocabulary the API emits (pinned by the `enum_wire_consistency` tests).

"pending_approval""queued""quota_blocked""concurrency_blocked""running""cancelling""succeeded""failed""cancelled"

supersededrequired

boolean

The merge queue superseded and cancelled this run (ADR 0160): render neutral, neither red nor in flight.

workflow_idrequired

string

Workflow id (UUID).

workflow_namerequired

string

The workflow's declared `name:` as the run pinned it.

workflow_path

string | null

The workflow file's repo path; `null` when the workflow is no longer registered.

CommitPullRequestRef

object

The pull request a commit belongs to, resolved at read time by matching the commit against PR heads (`is_head = true`) and historical revision heads (`is_head = false`). `None` when the commit is not any PR's (current or past) head.

is_headrequired

boolean

`true` if this commit is the PR's current head; `false` if it is only a historical revision head.

numberrequired

integerint32

statusrequired

PullRequestStatus

string

Lifecycle status of a pull request.

"open""merged""closed"

titlerequired

string