Skip to content
GitRiverGitRiver
RU
Navigation

GitHub Interface Compatibility

GitHub compatibility layer: which of its API calls are accepted, how the responses differ and what is not supported

GitRiver answers a subset of GitHub’s calls at /api/v3 — the same path used by GitHub Enterprise Server. A tool written for GitHub only needs its server address and token changed.

GitRiver also answers the GitLab interface, on /api/v4 (description). Numeric identifiers are shared between the two dialects: a repository’s id is the same in a /api/v3 response and in a /api/v4 response.

This document describes what is supported and what is not. Anything not in the “Supported Calls” table does not work, even if GitHub has such a call.

This layer’s contract is matching GitHub’s response: the /api/v1 compatibility promise does not extend to /api/v3, and the v3 here is the version of GitHub’s interface, not GitRiver’s.

Connecting

# gh
export GH_HOST=git.example.org
gh auth login --hostname git.example.org --with-token < token.txt

# octokit
new Octokit({ baseUrl: "https://git.example.org/api/v3", auth: token })

# curl
curl -H "Authorization: token $TOKEN" https://git.example.org/api/v3/user

The token is an ordinary GitRiver personal access token. Both header forms are accepted: Authorization: token <…> (used by gh and octokit) and Authorization: Bearer <…>.

Supported Calls

Call State
GET /api/v3 address map
GET /api/v3/user the token’s owner
GET /api/v3/user/repos the token owner’s repositories; parameters type, sort
GET /api/v3/users/{username} profile; visibility follows the public_profiles setting
GET /api/v3/users/{username}/repos the user’s repositories visible to the client
GET /api/v3/orgs/{org} a GitRiver group, shown as an organization
GET /api/v3/orgs/{org}/repos the group’s repositories visible to the client
GET /api/v3/repos/{owner}/{repo} a repository
GET /api/v3/repos/{owner}/{repo}/branches branches, paginated
GET /api/v3/repos/{owner}/{repo}/branches/{branch} one branch
GET /api/v3/repos/{owner}/{repo}/commits commits; parameters sha, path
GET /api/v3/repos/{owner}/{repo}/commits/{sha} one commit
GET /api/v3/repos/{owner}/{repo}/git/trees/{sha} a tree by id; recursive=1 for full depth
GET /api/v3/repos/{owner}/{repo}/contents/{path} a file, directory, symlink or submodule; parameter ref
GET /api/v3/repos/{owner}/{repo}/issues issues; parameter state
POST /api/v3/repos/{owner}/{repo}/issues create an issue
GET /api/v3/repos/{owner}/{repo}/issues/{number} one issue
PATCH /api/v3/repos/{owner}/{repo}/issues/{number} edit, close and reopen
GET /api/v3/repos/{owner}/{repo}/issues/{number}/comments comments
POST /api/v3/repos/{owner}/{repo}/issues/{number}/comments add a comment
GET /api/v3/repos/{owner}/{repo}/pulls pull requests; parameter state
POST /api/v3/repos/{owner}/{repo}/pulls create a pull request; head in owner:branch form — from a fork
GET /api/v3/repos/{owner}/{repo}/pulls/{number} one pull request
GET /api/v3/repos/{owner}/{repo}/releases releases; drafts only for those who can write
POST /api/v3/repos/{owner}/{repo}/releases create a release (the tag must exist)
GET /api/v3/repos/{owner}/{repo}/releases/tags/{tag} a release by tag
GET /api/v3/repos/{owner}/{repo}/commits/{sha}/statuses a commit’s check statuses, paginated
GET /api/v3/repos/{owner}/{repo}/commits/{sha}/status the combined status
POST /api/v3/repos/{owner}/{repo}/statuses/{sha} set a check status
GET /api/v3/repos/{owner}/{repo}/hooks webhooks, paginated (requires repository admin rights)

Mutating calls behave the same as the same actions through /api/v1: permission checks, webhooks, channel notifications, notifications and an activity feed entry.

Not yet supported: merging pull requests, code reviews and review-comment editing, webhook management (creating and deleting), labels and milestones as separate calls, git/blobs, events and notifications, GraphQL.

Pagination

Same as GitHub: page (starting at 1) and per_page (default 30, capped at 100) parameters, with adjacent pages in the Link header.

A page’s cost does not depend on its number: deep pages cost the same as early ones. There is one exception — commit history, described below.

rel="last" is only set where the total record count is known exactly: on branches, comments, releases and commit statuses. Commit history has no last. Walk a listing via rel="next" — it is present everywhere.

What Still Depends on Volume

The cost of a commit history page (/commits) grows with its number: on a repository with fifty thousand commits, page five hundred costs roughly thirty times more than the first. The page number is capped at ten thousand. A client that reads the whole history is better off cloning the repository.

The recursive tree (git/trees/{sha}?recursive=1) has no pagination — same as GitHub. The response is capped at ten thousand entries; beyond that limit the body carries "truncated": true, and the rest is read by subdirectory.

Errors

The error body is {"message": "…", "status": "…"}, as on GitHub: message holds the reason, status holds the response code as a string. Every failure of the layer takes this shape, including a nonexistent address, a wrong method, a response timeout and exceeding the rate limit.

An entity that fails validation is returned with code 422, as on GitHub (/api/v1 answers the same with 400). An unparseable request body is 400, same as GitHub.

The texts of 401 and 404 are canonical (Requires authentication, Not Found), as on GitHub; the detail of what exactly was not found is written to the server log. 403 and 422 carry a substantive text — same as GitHub.

An inaccessible object answers 404 with the same body as a nonexistent address: closed is indistinguishable from nonexistent. GitHub itself answers this way, and /api/v1 behaves the same. 403 stays where the client can see the object but lacks the rights for the action itself: an archived repository, a token without the needed scope, an edition limit.

The rate limit is shared with /api/v1: mutating calls land in the same bucket. The X-RateLimit-* headers are only sent on responses to mutating calls: reads are not rate-limited in GitRiver, and their responses carry none of these headers.

Divergences

The layer’s rule: a field either carries a genuine value or is not returned at all. The layer never returns plausible-looking substitute values.

Compatibility is understood this way: every supported call answers the same as on GitHub, minus the differences listed below. Calls not in the “Supported Calls” table are not supported.

Deliberate Differences

These are BEHAVIORAL differences. Differences in field composition are listed below, in “Differences in response fields”; that list is complete as of the release date.

What Our behavior What to keep in mind
GET /orgs/{org} and its lists visibility is decided by membership and the group’s own visibility level a private group is visible only to its members — same as in /api/v1 and /api/v4
GET /users/{username} visibility is decided by the server setting public_profiles; profiles are closed by default on GitHub, profiles are open by default. For a tool to read profiles without signing in, the administrator enables public_profiles; the setting acts the same on /api/v1, /api/v3 and /api/v4. The author’s card (author/user) of an issue, comment, pull request, review and release is always returned, regardless of the setting
rel="last" on commit history not set walk the history via rel="next"
contents for a file over 1 MB failure same as GitHub. But such a file cannot be read via git/blobs the way it can on GitHub: that call is not supported yet
url on file entries in a git/trees response not returned the git/blobs call it would point to is not supported
a CI job token acts as an anonymous client a private repository is not reachable with it; a script needs a personal token. On GitHub, the built-in Actions token reads its own repository
/issues returns only issues on GitHub, issues and pull requests share one number space, and /issues returns both. In GitRiver these are separate entities with independent numbering; pull requests are read via /pulls
head.sha and base.sha on a pull request empty the branch head is available from GET /repos/{owner}/{repo}/branches/{branch}

How Fields Are Filled

Field Our behavior
id an integer assigned to the object on first access and never changed afterward. One object has the same number in /api/v3 and /api/v4
node_id an opaque identifier built from the entity’s kind and its number — clients never parse it, only pass it back
avatar_url an identicon derived from the name (/avatars/{name}.svg): it is stable for a given name and needs no external service. GitRiver has no uploads of custom images
pushed_at the time of the last push — the same whether the push went over HTTP or SSH. null means no push has happened (same as GitHub for an empty repository)
updated_at of the token’s owner (GET /user) the time the profile was last edited
commit.message the full message text, not just the subject line
commit.tree the commit’s tree id

Every address the layer returns in responses (url, html_url, download_url, avatar_url, tree and owner addresses) points to an existing resource.

Tested Clients

The layer works with gh and @octokit/rest on every supported call, including pagination: gh api --paginate and octokit.paginate parse the Link header themselves.

A quirk of gh’s connection: it only accepts a hostname without a port and goes over HTTPS, so a server reachable as https://git.example.org connects with plain gh auth login --hostname. For a server on a nonstandard port or without TLS, a full address helps: GH_ENTERPRISE_TOKEN=… gh api http://server:port/api/v3/user.

What’s Guaranteed Separately From Response Shape

Numeric identifiers are stable across calls. Someone else’s private repository is unreachable both to a stranger with a token and to an anonymous client. The profile visibility setting acts the same on /api/v1 and /api/v3.

Differences in response fields

This list covers the names and types of response fields, nested ones included, compared with GitHub’s interface version 2022-11-28; it does not describe field values.

The list below is complete as of the release date for every supported call except those named at the end of this section: each difference in field composition is either removed or named here — what we do instead, and why. A release contains no undeclared differences.

Declared divergences

Field lists are expanded rather than tabulated: there are hundreds of them, and a table would be unreadable. Use find-in-page to look a field up — every field is named in full, together with its path inside the response.

We do not return it — all calls of this dialect, fields: 128.

GitHub repository fields that have no counterpart in GitRiver: license, language, topics, homepage, mirror, subscriber and network counts, the has_downloads and has_pull_requests flags, custom repository properties. The *_url family is a set of GitHub URL templates; some of them lead to calls the layer does not support. git_url is an address using the git:// protocol, which GitRiver does not support: clone over HTTPS or SSH (clone_url, ssh_url). open_issues_count is not returned. permissions is returned only in a response for a single repository, not in lists; GitRiver has no maintain and triage levels. A field leaves this list in the release where the layer starts returning it.

Fields

$.archive_url, $.assignees_url, $.blobs_url, $.collaborators_url, $.comments_url, $.commits_url, $.compare_url, $.contributors_url, $.deployments_url, $.downloads_url, $.events_url, $.forks_url, $.git_commits_url, $.git_refs_url, $.git_tags_url, $.git_url, $.has_downloads, $.has_pull_requests, $.homepage, $.hooks_url, $.issue_comment_url, $.issue_events_url, $.issues_url, $.keys_url, $.labels_url, $.language, $.languages_url, $.license, $.license.key, $.license.name, $.license.node_id, $.license.spdx_id, $.license.url, $.merges_url, $.milestones_url, $.mirror_url, $.network_count, $.notifications_url, $.open_issues, $.open_issues_count, $.owner.events_url, $.owner.followers_url, $.owner.following_url, $.owner.gists_url, $.owner.gravatar_id, $.owner.organizations_url, $.owner.received_events_url, $.owner.starred_url, $.owner.subscriptions_url, $.owner.user_view_type, $.permissions.maintain, $.permissions.triage, $.pull_request_creation_policy, $.stargazers_url, $.statuses_url, $.subscribers_count, $.subscribers_url, $.subscription_url, $.svn_url, $.tags_url, $.teams_url, $.temp_clone_token, $.topics, $.topics[], $[].archive_url, $[].assignees_url, $[].blobs_url, $[].collaborators_url, $[].comments_url, $[].commits_url, $[].compare_url, $[].contributors_url, $[].custom_properties, $[].deployments_url, $[].downloads_url, $[].events_url, $[].forks_url, $[].git_commits_url, $[].git_refs_url, $[].git_tags_url, $[].git_url, $[].has_downloads, $[].has_pull_requests, $[].homepage, $[].issue_comment_url, $[].issue_events_url, $[].keys_url, $[].labels_url, $[].language, $[].languages_url, $[].license, $[].license.key, $[].license.name, $[].license.node_id, $[].license.spdx_id, $[].license.url, $[].merges_url, $[].milestones_url, $[].mirror_url, $[].notifications_url, $[].open_issues, $[].open_issues_count, $[].owner.events_url, $[].owner.followers_url, $[].owner.following_url, $[].owner.gists_url, $[].owner.gravatar_id, $[].owner.organizations_url, $[].owner.received_events_url, $[].owner.starred_url, $[].owner.subscriptions_url, $[].owner.user_view_type, $[].permissions, $[].permissions.admin, $[].permissions.maintain, $[].permissions.pull, $[].permissions.push, $[].permissions.triage, $[].pull_request_creation_policy, $[].stargazers_url, $[].statuses_url, $[].subscribers_url, $[].subscription_url, $[].svn_url, $[].tags_url, $[].teams_url, $[].topics, $[].topics[]

We do not return it — all calls of this dialect, fields: 25.

Someone else’s profile (GET /users/{username}) is returned as a short card: without name, email, creation and edit times — those are present only in the token owner’s profile (GET /user). GitRiver’s member model has no bio, company, links to external networks, follower or public repository counts; the *_url family points to unsupported calls. A field leaves this list in the release where the layer starts returning it.

Fields

$.bio, $.blog, $.company, $.created_at, $.email, $.events_url, $.followers, $.followers_url, $.following, $.following_url, $.gists_url, $.gravatar_id, $.hireable, $.location, $.name, $.notification_email, $.organizations_url, $.public_gists, $.public_repos, $.received_events_url, $.starred_url, $.subscriptions_url, $.twitter_username, $.updated_at, $.user_view_type

We do not return it — all calls of this dialect, fields: 18.

GitHub organization fields with no counterpart in GitRiver: verified domain, project boards, member and public repository counts, company, location, email, blog, archival time; the *_url family points to unsupported calls. A field leaves this list in the release where the layer starts returning it.

Fields

$.archived_at, $.blog, $.company, $.email, $.events_url, $.followers, $.following, $.has_organization_projects, $.has_repository_projects, $.hooks_url, $.is_verified, $.issues_url, $.location, $.members_url, $.public_gists, $.public_members_url, $.public_repos, $.twitter_username

We do not return it — all calls of this dialect, fields: 164.

GitHub issue fields with no counterpart in GitRiver: author association, reactions, apps, sub-issues and dependencies, close reason, pinned comment, who closed the issue (closed_by). About the milestone: number is its number within the repository, and GitRiver has no numbering of its own for milestones; creator, who created the milestone, is not stored; closed_issues is not returned; there is no milestone page and no milestone-labels call, so there is no html_url or labels_url either. The issue’s author has no *_url templates pointing to unsupported calls. A field leaves this list in the release where the layer starts returning it.

Fields

$.author_association, $.closed_by, $.closed_by.avatar_url, $.closed_by.events_url, $.closed_by.followers_url, $.closed_by.following_url, $.closed_by.gists_url, $.closed_by.gravatar_id, $.closed_by.html_url, $.closed_by.id, $.closed_by.login, $.closed_by.node_id, $.closed_by.organizations_url, $.closed_by.received_events_url, $.closed_by.repos_url, $.closed_by.site_admin, $.closed_by.starred_url, $.closed_by.subscriptions_url, $.closed_by.type, $.closed_by.url, $.closed_by.user_view_type, $.comments_url, $.events_url, $.issue_dependencies_summary, $.issue_dependencies_summary.blocked_by, $.issue_dependencies_summary.blocking, $.issue_dependencies_summary.total_blocked_by, $.issue_dependencies_summary.total_blocking, $.labels_url, $.milestone.closed_issues, $.milestone.creator, $.milestone.creator.avatar_url, $.milestone.creator.events_url, $.milestone.creator.followers_url, $.milestone.creator.following_url, $.milestone.creator.gists_url, $.milestone.creator.gravatar_id, $.milestone.creator.html_url, $.milestone.creator.id, $.milestone.creator.login, $.milestone.creator.node_id, $.milestone.creator.organizations_url, $.milestone.creator.received_events_url, $.milestone.creator.repos_url, $.milestone.creator.site_admin, $.milestone.creator.starred_url, $.milestone.creator.subscriptions_url, $.milestone.creator.type, $.milestone.creator.url, $.milestone.creator.user_view_type, $.milestone.html_url, $.milestone.labels_url, $.milestone.number, $.performed_via_github_app, $.pinned_comment, $.reactions, $.reactions.+1, $.reactions.-1, $.reactions.confused, $.reactions.eyes, $.reactions.heart, $.reactions.hooray, $.reactions.laugh, $.reactions.rocket, $.reactions.total_count, $.reactions.url, $.state_reason, $.sub_issues_summary, $.sub_issues_summary.completed, $.sub_issues_summary.percent_completed, $.sub_issues_summary.total, $.timeline_url, $.user.events_url, $.user.followers_url, $.user.following_url, $.user.gists_url, $.user.gravatar_id, $.user.organizations_url, $.user.received_events_url, $.user.starred_url, $.user.subscriptions_url, $.user.user_view_type, $[].author_association, $[].closed_by, $[].closed_by.avatar_url, $[].closed_by.events_url, $[].closed_by.followers_url, $[].closed_by.following_url, $[].closed_by.gists_url, $[].closed_by.gravatar_id, $[].closed_by.html_url, $[].closed_by.id, $[].closed_by.login, $[].closed_by.node_id, $[].closed_by.organizations_url, $[].closed_by.received_events_url, $[].closed_by.repos_url, $[].closed_by.site_admin, $[].closed_by.starred_url, $[].closed_by.subscriptions_url, $[].closed_by.type, $[].closed_by.url, $[].closed_by.user_view_type, $[].comments_url, $[].events_url, $[].issue_dependencies_summary, $[].issue_dependencies_summary.blocked_by, $[].issue_dependencies_summary.blocking, $[].issue_dependencies_summary.total_blocked_by, $[].issue_dependencies_summary.total_blocking, $[].labels_url, $[].milestone.closed_issues, $[].milestone.creator, $[].milestone.creator.avatar_url, $[].milestone.creator.events_url, $[].milestone.creator.followers_url, $[].milestone.creator.following_url, $[].milestone.creator.gists_url, $[].milestone.creator.gravatar_id, $[].milestone.creator.html_url, $[].milestone.creator.id, $[].milestone.creator.login, $[].milestone.creator.node_id, $[].milestone.creator.organizations_url, $[].milestone.creator.received_events_url, $[].milestone.creator.repos_url, $[].milestone.creator.site_admin, $[].milestone.creator.starred_url, $[].milestone.creator.subscriptions_url, $[].milestone.creator.type, $[].milestone.creator.url, $[].milestone.creator.user_view_type, $[].milestone.html_url, $[].milestone.labels_url, $[].milestone.number, $[].performed_via_github_app, $[].pinned_comment, $[].reactions, $[].reactions.+1, $[].reactions.-1, $[].reactions.confused, $[].reactions.eyes, $[].reactions.heart, $[].reactions.hooray, $[].reactions.laugh, $[].reactions.rocket, $[].reactions.total_count, $[].reactions.url, $[].state_reason, $[].sub_issues_summary, $[].sub_issues_summary.completed, $[].sub_issues_summary.percent_completed, $[].sub_issues_summary.total, $[].timeline_url, $[].user.events_url, $[].user.followers_url, $[].user.following_url, $[].user.gists_url, $[].user.gravatar_id, $[].user.organizations_url, $[].user.received_events_url, $[].user.starred_url, $[].user.subscriptions_url, $[].user.user_view_type

We do not return it — all calls of this dialect, fields: 25.

GitHub comment fields with no counterpart in GitRiver: author association, reactions, comment minimization and pinning, apps. The author has no *_url templates pointing to unsupported calls. A field leaves this list in the release where the layer starts returning it.

Fields

$[].author_association, $[].minimized, $[].performed_via_github_app, $[].pin, $[].reactions, $[].reactions.+1, $[].reactions.-1, $[].reactions.confused, $[].reactions.eyes, $[].reactions.heart, $[].reactions.hooray, $[].reactions.laugh, $[].reactions.rocket, $[].reactions.total_count, $[].reactions.url, $[].user.events_url, $[].user.followers_url, $[].user.following_url, $[].user.gists_url, $[].user.gravatar_id, $[].user.organizations_url, $[].user.received_events_url, $[].user.starred_url, $[].user.subscriptions_url, $[].user.user_view_type

We do not return it — all calls of this dialect, fields: 568.

GitHub pull request fields with no counterpart in GitRiver: auto-merge, maintainer-editable flag, rebaseable flag, reviewer teams, author association, who merged the pull request (merged_by), comment counters (comments, review_comments), diff addresses (diff_url, patch_url) and some of the _links. Nested repository and member cards (head.repo, base.repo, head.user, base.user) are not returned: repository details come from GET /repos/{owner}/{repo}. A field leaves this list in the release where the layer starts returning it.

Fields

$._links.commits, $._links.commits.href, $._links.review_comment, $._links.review_comment.href, $._links.review_comments, $._links.review_comments.href, $._links.statuses, $._links.statuses.href, $.author_association, $.auto_merge, $.base.repo, $.base.repo.allow_forking, $.base.repo.archive_url, $.base.repo.archived, $.base.repo.assignees_url, $.base.repo.blobs_url, $.base.repo.branches_url, $.base.repo.clone_url, $.base.repo.collaborators_url, $.base.repo.comments_url, $.base.repo.commits_url, $.base.repo.compare_url, $.base.repo.contents_url, $.base.repo.contributors_url, $.base.repo.created_at, $.base.repo.default_branch, $.base.repo.deployments_url, $.base.repo.description, $.base.repo.disabled, $.base.repo.downloads_url, $.base.repo.events_url, $.base.repo.fork, $.base.repo.forks, $.base.repo.forks_count, $.base.repo.forks_url, $.base.repo.full_name, $.base.repo.git_commits_url, $.base.repo.git_refs_url, $.base.repo.git_tags_url, $.base.repo.git_url, $.base.repo.has_discussions, $.base.repo.has_downloads, $.base.repo.has_issues, $.base.repo.has_pages, $.base.repo.has_projects, $.base.repo.has_pull_requests, $.base.repo.has_wiki, $.base.repo.homepage, $.base.repo.hooks_url, $.base.repo.html_url, $.base.repo.id, $.base.repo.is_template, $.base.repo.issue_comment_url, $.base.repo.issue_events_url, $.base.repo.issues_url, $.base.repo.keys_url, $.base.repo.labels_url, $.base.repo.language, $.base.repo.languages_url, $.base.repo.license, $.base.repo.license.key, $.base.repo.license.name, $.base.repo.license.node_id, $.base.repo.license.spdx_id, $.base.repo.license.url, $.base.repo.merges_url, $.base.repo.milestones_url, $.base.repo.mirror_url, $.base.repo.name, $.base.repo.node_id, $.base.repo.notifications_url, $.base.repo.open_issues, $.base.repo.open_issues_count, $.base.repo.owner, $.base.repo.owner.avatar_url, $.base.repo.owner.events_url, $.base.repo.owner.followers_url, $.base.repo.owner.following_url, $.base.repo.owner.gists_url, $.base.repo.owner.gravatar_id, $.base.repo.owner.html_url, $.base.repo.owner.id, $.base.repo.owner.login, $.base.repo.owner.node_id, $.base.repo.owner.organizations_url, $.base.repo.owner.received_events_url, $.base.repo.owner.repos_url, $.base.repo.owner.site_admin, $.base.repo.owner.starred_url, $.base.repo.owner.subscriptions_url, $.base.repo.owner.type, $.base.repo.owner.url, $.base.repo.owner.user_view_type, $.base.repo.private, $.base.repo.pull_request_creation_policy, $.base.repo.pulls_url, $.base.repo.pushed_at, $.base.repo.releases_url, $.base.repo.size, $.base.repo.ssh_url, $.base.repo.stargazers_count, $.base.repo.stargazers_url, $.base.repo.statuses_url, $.base.repo.subscribers_url, $.base.repo.subscription_url, $.base.repo.svn_url, $.base.repo.tags_url, $.base.repo.teams_url, $.base.repo.topics, $.base.repo.topics[], $.base.repo.trees_url, $.base.repo.updated_at, $.base.repo.url, $.base.repo.visibility, $.base.repo.watchers, $.base.repo.watchers_count, $.base.repo.web_commit_signoff_required, $.base.user, $.base.user.avatar_url, $.base.user.events_url, $.base.user.followers_url, $.base.user.following_url, $.base.user.gists_url, $.base.user.gravatar_id, $.base.user.html_url, $.base.user.id, $.base.user.login, $.base.user.node_id, $.base.user.organizations_url, $.base.user.received_events_url, $.base.user.repos_url, $.base.user.site_admin, $.base.user.starred_url, $.base.user.subscriptions_url, $.base.user.type, $.base.user.url, $.base.user.user_view_type, $.comments, $.comments_url, $.commits_url, $.diff_url, $.head.repo, $.head.repo.allow_forking, $.head.repo.archive_url, $.head.repo.archived, $.head.repo.assignees_url, $.head.repo.blobs_url, $.head.repo.branches_url, $.head.repo.clone_url, $.head.repo.collaborators_url, $.head.repo.comments_url, $.head.repo.commits_url, $.head.repo.compare_url, $.head.repo.contents_url, $.head.repo.contributors_url, $.head.repo.created_at, $.head.repo.default_branch, $.head.repo.deployments_url, $.head.repo.description, $.head.repo.disabled, $.head.repo.downloads_url, $.head.repo.events_url, $.head.repo.fork, $.head.repo.forks, $.head.repo.forks_count, $.head.repo.forks_url, $.head.repo.full_name, $.head.repo.git_commits_url, $.head.repo.git_refs_url, $.head.repo.git_tags_url, $.head.repo.git_url, $.head.repo.has_discussions, $.head.repo.has_downloads, $.head.repo.has_issues, $.head.repo.has_pages, $.head.repo.has_projects, $.head.repo.has_pull_requests, $.head.repo.has_wiki, $.head.repo.homepage, $.head.repo.hooks_url, $.head.repo.html_url, $.head.repo.id, $.head.repo.is_template, $.head.repo.issue_comment_url, $.head.repo.issue_events_url, $.head.repo.issues_url, $.head.repo.keys_url, $.head.repo.labels_url, $.head.repo.language, $.head.repo.languages_url, $.head.repo.license, $.head.repo.license.key, $.head.repo.license.name, $.head.repo.license.node_id, $.head.repo.license.spdx_id, $.head.repo.license.url, $.head.repo.merges_url, $.head.repo.milestones_url, $.head.repo.mirror_url, $.head.repo.name, $.head.repo.node_id, $.head.repo.notifications_url, $.head.repo.open_issues, $.head.repo.open_issues_count, $.head.repo.owner, $.head.repo.owner.avatar_url, $.head.repo.owner.events_url, $.head.repo.owner.followers_url, $.head.repo.owner.following_url, $.head.repo.owner.gists_url, $.head.repo.owner.gravatar_id, $.head.repo.owner.html_url, $.head.repo.owner.id, $.head.repo.owner.login, $.head.repo.owner.node_id, $.head.repo.owner.organizations_url, $.head.repo.owner.received_events_url, $.head.repo.owner.repos_url, $.head.repo.owner.site_admin, $.head.repo.owner.starred_url, $.head.repo.owner.subscriptions_url, $.head.repo.owner.type, $.head.repo.owner.url, $.head.repo.owner.user_view_type, $.head.repo.private, $.head.repo.pull_request_creation_policy, $.head.repo.pulls_url, $.head.repo.pushed_at, $.head.repo.releases_url, $.head.repo.size, $.head.repo.ssh_url, $.head.repo.stargazers_count, $.head.repo.stargazers_url, $.head.repo.statuses_url, $.head.repo.subscribers_url, $.head.repo.subscription_url, $.head.repo.svn_url, $.head.repo.tags_url, $.head.repo.teams_url, $.head.repo.topics, $.head.repo.trees_url, $.head.repo.updated_at, $.head.repo.url, $.head.repo.visibility, $.head.repo.watchers, $.head.repo.watchers_count, $.head.repo.web_commit_signoff_required, $.head.user, $.head.user.avatar_url, $.head.user.events_url, $.head.user.followers_url, $.head.user.following_url, $.head.user.gists_url, $.head.user.gravatar_id, $.head.user.html_url, $.head.user.id, $.head.user.login, $.head.user.node_id, $.head.user.organizations_url, $.head.user.received_events_url, $.head.user.repos_url, $.head.user.site_admin, $.head.user.starred_url, $.head.user.subscriptions_url, $.head.user.type, $.head.user.url, $.head.user.user_view_type, $.maintainer_can_modify, $.merged_by, $.patch_url, $.rebaseable, $.requested_teams, $.review_comment_url, $.review_comments, $.review_comments_url, $.statuses_url, $.user.events_url, $.user.followers_url, $.user.following_url, $.user.gists_url, $.user.gravatar_id, $.user.organizations_url, $.user.received_events_url, $.user.starred_url, $.user.subscriptions_url, $.user.user_view_type, $[]._links.commits, $[]._links.commits.href, $[]._links.review_comment, $[]._links.review_comment.href, $[]._links.review_comments, $[]._links.review_comments.href, $[]._links.statuses, $[]._links.statuses.href, $[].author_association, $[].auto_merge, $[].base.repo, $[].base.repo.allow_forking, $[].base.repo.archive_url, $[].base.repo.archived, $[].base.repo.assignees_url, $[].base.repo.blobs_url, $[].base.repo.branches_url, $[].base.repo.clone_url, $[].base.repo.collaborators_url, $[].base.repo.comments_url, $[].base.repo.commits_url, $[].base.repo.compare_url, $[].base.repo.contents_url, $[].base.repo.contributors_url, $[].base.repo.created_at, $[].base.repo.default_branch, $[].base.repo.deployments_url, $[].base.repo.description, $[].base.repo.disabled, $[].base.repo.downloads_url, $[].base.repo.events_url, $[].base.repo.fork, $[].base.repo.forks, $[].base.repo.forks_count, $[].base.repo.forks_url, $[].base.repo.full_name, $[].base.repo.git_commits_url, $[].base.repo.git_refs_url, $[].base.repo.git_tags_url, $[].base.repo.git_url, $[].base.repo.has_discussions, $[].base.repo.has_downloads, $[].base.repo.has_issues, $[].base.repo.has_pages, $[].base.repo.has_projects, $[].base.repo.has_pull_requests, $[].base.repo.has_wiki, $[].base.repo.homepage, $[].base.repo.hooks_url, $[].base.repo.html_url, $[].base.repo.id, $[].base.repo.is_template, $[].base.repo.issue_comment_url, $[].base.repo.issue_events_url, $[].base.repo.issues_url, $[].base.repo.keys_url, $[].base.repo.labels_url, $[].base.repo.language, $[].base.repo.languages_url, $[].base.repo.license, $[].base.repo.license.key, $[].base.repo.license.name, $[].base.repo.license.node_id, $[].base.repo.license.spdx_id, $[].base.repo.license.url, $[].base.repo.merges_url, $[].base.repo.milestones_url, $[].base.repo.mirror_url, $[].base.repo.name, $[].base.repo.node_id, $[].base.repo.notifications_url, $[].base.repo.open_issues, $[].base.repo.open_issues_count, $[].base.repo.owner, $[].base.repo.owner.avatar_url, $[].base.repo.owner.events_url, $[].base.repo.owner.followers_url, $[].base.repo.owner.following_url, $[].base.repo.owner.gists_url, $[].base.repo.owner.gravatar_id, $[].base.repo.owner.html_url, $[].base.repo.owner.id, $[].base.repo.owner.login, $[].base.repo.owner.node_id, $[].base.repo.owner.organizations_url, $[].base.repo.owner.received_events_url, $[].base.repo.owner.repos_url, $[].base.repo.owner.site_admin, $[].base.repo.owner.starred_url, $[].base.repo.owner.subscriptions_url, $[].base.repo.owner.type, $[].base.repo.owner.url, $[].base.repo.owner.user_view_type, $[].base.repo.private, $[].base.repo.pull_request_creation_policy, $[].base.repo.pulls_url, $[].base.repo.pushed_at, $[].base.repo.releases_url, $[].base.repo.size, $[].base.repo.ssh_url, $[].base.repo.stargazers_count, $[].base.repo.stargazers_url, $[].base.repo.statuses_url, $[].base.repo.subscribers_url, $[].base.repo.subscription_url, $[].base.repo.svn_url, $[].base.repo.tags_url, $[].base.repo.teams_url, $[].base.repo.topics, $[].base.repo.topics[], $[].base.repo.trees_url, $[].base.repo.updated_at, $[].base.repo.url, $[].base.repo.visibility, $[].base.repo.watchers, $[].base.repo.watchers_count, $[].base.repo.web_commit_signoff_required, $[].base.user, $[].base.user.avatar_url, $[].base.user.events_url, $[].base.user.followers_url, $[].base.user.following_url, $[].base.user.gists_url, $[].base.user.gravatar_id, $[].base.user.html_url, $[].base.user.id, $[].base.user.login, $[].base.user.node_id, $[].base.user.organizations_url, $[].base.user.received_events_url, $[].base.user.repos_url, $[].base.user.site_admin, $[].base.user.starred_url, $[].base.user.subscriptions_url, $[].base.user.type, $[].base.user.url, $[].base.user.user_view_type, $[].comments_url, $[].commits_url, $[].diff_url, $[].head.repo, $[].head.repo.allow_forking, $[].head.repo.archive_url, $[].head.repo.archived, $[].head.repo.assignees_url, $[].head.repo.blobs_url, $[].head.repo.branches_url, $[].head.repo.clone_url, $[].head.repo.collaborators_url, $[].head.repo.comments_url, $[].head.repo.commits_url, $[].head.repo.compare_url, $[].head.repo.contents_url, $[].head.repo.contributors_url, $[].head.repo.created_at, $[].head.repo.default_branch, $[].head.repo.deployments_url, $[].head.repo.description, $[].head.repo.disabled, $[].head.repo.downloads_url, $[].head.repo.events_url, $[].head.repo.fork, $[].head.repo.forks, $[].head.repo.forks_count, $[].head.repo.forks_url, $[].head.repo.full_name, $[].head.repo.git_commits_url, $[].head.repo.git_refs_url, $[].head.repo.git_tags_url, $[].head.repo.git_url, $[].head.repo.has_discussions, $[].head.repo.has_downloads, $[].head.repo.has_issues, $[].head.repo.has_pages, $[].head.repo.has_projects, $[].head.repo.has_pull_requests, $[].head.repo.has_wiki, $[].head.repo.homepage, $[].head.repo.hooks_url, $[].head.repo.html_url, $[].head.repo.id, $[].head.repo.is_template, $[].head.repo.issue_comment_url, $[].head.repo.issue_events_url, $[].head.repo.issues_url, $[].head.repo.keys_url, $[].head.repo.labels_url, $[].head.repo.language, $[].head.repo.languages_url, $[].head.repo.license, $[].head.repo.license.key, $[].head.repo.license.name, $[].head.repo.license.node_id, $[].head.repo.license.spdx_id, $[].head.repo.license.url, $[].head.repo.merges_url, $[].head.repo.milestones_url, $[].head.repo.mirror_url, $[].head.repo.name, $[].head.repo.node_id, $[].head.repo.notifications_url, $[].head.repo.open_issues, $[].head.repo.open_issues_count, $[].head.repo.owner, $[].head.repo.owner.avatar_url, $[].head.repo.owner.events_url, $[].head.repo.owner.followers_url, $[].head.repo.owner.following_url, $[].head.repo.owner.gists_url, $[].head.repo.owner.gravatar_id, $[].head.repo.owner.html_url, $[].head.repo.owner.id, $[].head.repo.owner.login, $[].head.repo.owner.node_id, $[].head.repo.owner.organizations_url, $[].head.repo.owner.received_events_url, $[].head.repo.owner.repos_url, $[].head.repo.owner.site_admin, $[].head.repo.owner.starred_url, $[].head.repo.owner.subscriptions_url, $[].head.repo.owner.type, $[].head.repo.owner.url, $[].head.repo.owner.user_view_type, $[].head.repo.private, $[].head.repo.pull_request_creation_policy, $[].head.repo.pulls_url, $[].head.repo.pushed_at, $[].head.repo.releases_url, $[].head.repo.size, $[].head.repo.ssh_url, $[].head.repo.stargazers_count, $[].head.repo.stargazers_url, $[].head.repo.statuses_url, $[].head.repo.subscribers_url, $[].head.repo.subscription_url, $[].head.repo.svn_url, $[].head.repo.tags_url, $[].head.repo.teams_url, $[].head.repo.topics, $[].head.repo.topics[], $[].head.repo.trees_url, $[].head.repo.updated_at, $[].head.repo.url, $[].head.repo.visibility, $[].head.repo.watchers, $[].head.repo.watchers_count, $[].head.repo.web_commit_signoff_required, $[].head.user, $[].head.user.avatar_url, $[].head.user.events_url, $[].head.user.followers_url, $[].head.user.following_url, $[].head.user.gists_url, $[].head.user.gravatar_id, $[].head.user.html_url, $[].head.user.id, $[].head.user.login, $[].head.user.node_id, $[].head.user.organizations_url, $[].head.user.received_events_url, $[].head.user.repos_url, $[].head.user.site_admin, $[].head.user.starred_url, $[].head.user.subscriptions_url, $[].head.user.type, $[].head.user.url, $[].head.user.user_view_type, $[].patch_url, $[].requested_teams, $[].review_comment_url, $[].review_comments_url, $[].statuses_url, $[].user.events_url, $[].user.followers_url, $[].user.following_url, $[].user.gists_url, $[].user.gravatar_id, $[].user.organizations_url, $[].user.received_events_url, $[].user.starred_url, $[].user.subscriptions_url, $[].user.user_view_type

We do not return it — all calls of this dialect, fields: 98.

Release attachments (assets[]) have no url description address, no digest and no uploader card (uploader): GitRiver does not record who uploaded a file; download via browser_download_url. There is no upload_url: uploading files through this layer is not supported. There are no reactions, discussion, target_commitish, immutable or mentions_count; the author has no *_url templates pointing to unsupported calls. A field leaves this list in the release where the layer starts returning it.

Fields

$.assets[].digest, $.assets[].uploader, $.assets[].uploader.avatar_url, $.assets[].uploader.events_url, $.assets[].uploader.followers_url, $.assets[].uploader.following_url, $.assets[].uploader.gists_url, $.assets[].uploader.gravatar_id, $.assets[].uploader.html_url, $.assets[].uploader.id, $.assets[].uploader.login, $.assets[].uploader.node_id, $.assets[].uploader.organizations_url, $.assets[].uploader.received_events_url, $.assets[].uploader.repos_url, $.assets[].uploader.site_admin, $.assets[].uploader.starred_url, $.assets[].uploader.subscriptions_url, $.assets[].uploader.type, $.assets[].uploader.url, $.assets[].uploader.user_view_type, $.assets[].url, $.author.events_url, $.author.followers_url, $.author.following_url, $.author.gists_url, $.author.gravatar_id, $.author.organizations_url, $.author.received_events_url, $.author.repos_url, $.author.starred_url, $.author.subscriptions_url, $.author.user_view_type, $.discussion_url, $.immutable, $.reactions, $.reactions.+1, $.reactions.-1, $.reactions.confused, $.reactions.eyes, $.reactions.heart, $.reactions.hooray, $.reactions.laugh, $.reactions.rocket, $.reactions.total_count, $.reactions.url, $.target_commitish, $.updated_at, $.upload_url, $[].assets[].digest, $[].assets[].uploader, $[].assets[].uploader.avatar_url, $[].assets[].uploader.events_url, $[].assets[].uploader.followers_url, $[].assets[].uploader.following_url, $[].assets[].uploader.gists_url, $[].assets[].uploader.gravatar_id, $[].assets[].uploader.html_url, $[].assets[].uploader.id, $[].assets[].uploader.login, $[].assets[].uploader.node_id, $[].assets[].uploader.organizations_url, $[].assets[].uploader.received_events_url, $[].assets[].uploader.repos_url, $[].assets[].uploader.site_admin, $[].assets[].uploader.starred_url, $[].assets[].uploader.subscriptions_url, $[].assets[].uploader.type, $[].assets[].uploader.url, $[].assets[].uploader.user_view_type, $[].assets[].url, $[].author.events_url, $[].author.followers_url, $[].author.following_url, $[].author.gists_url, $[].author.gravatar_id, $[].author.organizations_url, $[].author.received_events_url, $[].author.repos_url, $[].author.starred_url, $[].author.subscriptions_url, $[].author.user_view_type, $[].discussion_url, $[].immutable, $[].mentions_count, $[].reactions, $[].reactions.+1, $[].reactions.-1, $[].reactions.confused, $[].reactions.eyes, $[].reactions.heart, $[].reactions.hooray, $[].reactions.laugh, $[].reactions.rocket, $[].reactions.total_count, $[].reactions.url, $[].target_commitish, $[].upload_url

We do not return it — all calls of this dialect, fields: 95.

Author and committer cards as server members (top-level author, committer) are not returned: name, email and time are in commit.author and commit.committer. There is no commit signature information (commit.verification), no comments_url, and no sha on files[] entries. A field leaves this list in the release where the layer starts returning it.

Fields

$.author, $.author.avatar_url, $.author.events_url, $.author.followers_url, $.author.following_url, $.author.gists_url, $.author.gravatar_id, $.author.html_url, $.author.id, $.author.login, $.author.node_id, $.author.organizations_url, $.author.received_events_url, $.author.repos_url, $.author.site_admin, $.author.starred_url, $.author.subscriptions_url, $.author.type, $.author.url, $.author.user_view_type, $.comments_url, $.commit.verification, $.commit.verification.payload, $.commit.verification.reason, $.commit.verification.signature, $.commit.verification.verified, $.commit.verification.verified_at, $.committer, $.committer.avatar_url, $.committer.events_url, $.committer.followers_url, $.committer.following_url, $.committer.gists_url, $.committer.gravatar_id, $.committer.html_url, $.committer.id, $.committer.login, $.committer.node_id, $.committer.organizations_url, $.committer.received_events_url, $.committer.repos_url, $.committer.site_admin, $.committer.starred_url, $.committer.subscriptions_url, $.committer.type, $.committer.url, $.committer.user_view_type, $.files[].sha, $[].author, $[].author.avatar_url, $[].author.events_url, $[].author.followers_url, $[].author.following_url, $[].author.gists_url, $[].author.gravatar_id, $[].author.html_url, $[].author.id, $[].author.login, $[].author.node_id, $[].author.organizations_url, $[].author.received_events_url, $[].author.repos_url, $[].author.site_admin, $[].author.starred_url, $[].author.subscriptions_url, $[].author.type, $[].author.url, $[].author.user_view_type, $[].comments_url, $[].commit.verification, $[].commit.verification.payload, $[].commit.verification.reason, $[].commit.verification.signature, $[].commit.verification.verified, $[].commit.verification.verified_at, $[].committer, $[].committer.avatar_url, $[].committer.events_url, $[].committer.followers_url, $[].committer.following_url, $[].committer.gists_url, $[].committer.gravatar_id, $[].committer.html_url, $[].committer.id, $[].committer.login, $[].committer.node_id, $[].committer.organizations_url, $[].committer.received_events_url, $[].committer.repos_url, $[].committer.site_admin, $[].committer.starred_url, $[].committer.subscriptions_url, $[].committer.type, $[].committer.url, $[].committer.user_view_type

We do not return it — all calls of this dialect, fields: 47.

The repository card in the combined status (repository) and its owner have no *_url templates pointing to unsupported calls; neither does the status author (creator). A field leaves this list in the release where the layer starts returning it.

Fields

$.repository.archive_url, $.repository.assignees_url, $.repository.blobs_url, $.repository.collaborators_url, $.repository.comments_url, $.repository.compare_url, $.repository.contributors_url, $.repository.deployments_url, $.repository.downloads_url, $.repository.events_url, $.repository.forks_url, $.repository.git_commits_url, $.repository.git_refs_url, $.repository.git_tags_url, $.repository.issue_comment_url, $.repository.issue_events_url, $.repository.keys_url, $.repository.labels_url, $.repository.languages_url, $.repository.merges_url, $.repository.milestones_url, $.repository.notifications_url, $.repository.owner.events_url, $.repository.owner.followers_url, $.repository.owner.following_url, $.repository.owner.gists_url, $.repository.owner.gravatar_id, $.repository.owner.organizations_url, $.repository.owner.received_events_url, $.repository.owner.starred_url, $.repository.owner.subscriptions_url, $.repository.owner.user_view_type, $.repository.stargazers_url, $.repository.subscribers_url, $.repository.subscription_url, $.repository.tags_url, $.repository.teams_url, $[].creator.events_url, $[].creator.followers_url, $[].creator.following_url, $[].creator.gists_url, $[].creator.gravatar_id, $[].creator.organizations_url, $[].creator.received_events_url, $[].creator.starred_url, $[].creator.subscriptions_url, $[].creator.user_view_type

We do not return it — all calls of this dialect, fields: 76.

A branch’s nested commit carries only sha and url: the full commit comes from GET /repos/{owner}/{repo}/commits/{sha}. protection and protection_url describe protection rules in GitHub’s own terms (required checks, reviews, force-push restrictions): GitRiver’s rule set is different and is not translated into GitHub’s shape. Whether a branch is protected is shown by the protected field. A field leaves this list in the release where the layer starts returning it.

Fields

$.commit.author, $.commit.author.avatar_url, $.commit.author.events_url, $.commit.author.followers_url, $.commit.author.following_url, $.commit.author.gists_url, $.commit.author.gravatar_id, $.commit.author.html_url, $.commit.author.id, $.commit.author.login, $.commit.author.node_id, $.commit.author.organizations_url, $.commit.author.received_events_url, $.commit.author.repos_url, $.commit.author.site_admin, $.commit.author.starred_url, $.commit.author.subscriptions_url, $.commit.author.type, $.commit.author.url, $.commit.author.user_view_type, $.commit.comments_url, $.commit.commit, $.commit.commit.author, $.commit.commit.author.date, $.commit.commit.author.email, $.commit.commit.author.name, $.commit.commit.comment_count, $.commit.commit.committer, $.commit.commit.committer.date, $.commit.commit.committer.email, $.commit.commit.committer.name, $.commit.commit.message, $.commit.commit.tree, $.commit.commit.tree.sha, $.commit.commit.tree.url, $.commit.commit.url, $.commit.commit.verification, $.commit.commit.verification.payload, $.commit.commit.verification.reason, $.commit.commit.verification.signature, $.commit.commit.verification.verified, $.commit.commit.verification.verified_at, $.commit.committer, $.commit.committer.avatar_url, $.commit.committer.events_url, $.commit.committer.followers_url, $.commit.committer.following_url, $.commit.committer.gists_url, $.commit.committer.gravatar_id, $.commit.committer.html_url, $.commit.committer.id, $.commit.committer.login, $.commit.committer.node_id, $.commit.committer.organizations_url, $.commit.committer.received_events_url, $.commit.committer.repos_url, $.commit.committer.site_admin, $.commit.committer.starred_url, $.commit.committer.subscriptions_url, $.commit.committer.type, $.commit.committer.url, $.commit.committer.user_view_type, $.commit.html_url, $.commit.node_id, $.commit.parents, $.commit.parents[], $.commit.parents[].html_url, $.commit.parents[].sha, $.commit.parents[].url, $.protection, $.protection.enabled, $.protection.required_status_checks, $.protection.required_status_checks.checks, $.protection.required_status_checks.contexts, $.protection.required_status_checks.enforcement_level, $.protection_url

We do not return it — all calls of this dialect, fields: 4.

git_url points to the /git/blobs/{sha} call, which the layer does not support; _links.git is the same address. A field leaves this list in the release where the layer starts returning it.

Fields

$._links.git, $.git_url, $[]._links.git, $[].git_url

We do not return it — all calls of this dialect, fields: 1.

The documentation_url field is not returned in an error body: on GitHub it points to GitHub’s own documentation. The field is optional. A field leaves this list in the release where the layer starts returning it.

Fields

$.documentation_url

We do not return it — all calls of this dialect, fields: 30.

GitHub’s API root lists URL templates for ALL calls on the platform. GitRiver’s root names only the ones the layer supports. A field leaves this list in the release where the layer starts returning it.

Fields

$.authorizations_url, $.code_search_url, $.commit_search_url, $.current_user_authorizations_html_url, $.current_user_repositories_url, $.emails_url, $.emojis_url, $.events_url, $.feeds_url, $.followers_url, $.following_url, $.gists_url, $.hub_url, $.issue_search_url, $.issues_url, $.keys_url, $.label_search_url, $.notifications_url, $.organization_repositories_url, $.organization_teams_url, $.organization_url, $.public_gists_url, $.rate_limit_url, $.repository_search_url, $.starred_gists_url, $.starred_url, $.topic_search_url, $.user_organizations_url, $.user_repositories_url, $.user_search_url

We always return it empty — all calls of this dialect, fields: 2.

The field exists but is always empty: GitRiver does not store a milestone’s close time. A field leaves this list in the release where the layer starts filling it in.

Fields

$.milestone.closed_at, $[].milestone.closed_at

We always return it empty — all calls of this dialect, fields: 2.

The field exists but is always empty on an OPEN pull request: on GitHub it points to a trial merge prepared in advance, while GitRiver does not perform a trial merge — the merge commit only appears when the merge happens. On a merged pull request the field is filled in. A field leaves this list in the release where the layer starts filling it in.

Fields

$.merge_commit_sha, $[].merge_commit_sha

Calls outside the list

Call What to keep in mind
hooks the response’s field composition has not been matched against GitHub; differences, if any, are not named above