Navigation
GitLab Interface Compatibility
GitLab compatibility layer: which of its API calls are accepted, how the responses differ and what is not supported
GitRiver answers a subset of GitLab’s calls at /api/v4 — the same path used
by GitLab itself. A tool written for GitLab only needs its server address and
token changed.
This document describes what is supported and what is not. Anything not in the “Supported Calls” table does not work, even if GitLab has such a call.
This layer’s contract is matching GitLab’s response: the
/api/v1 compatibility promise does not extend to
/api/v4, and the v4 here is the version of GitLab’s interface, not
GitRiver’s.
GitRiver also answers the GitHub interface, on /api/v3
(description). Numeric identifiers are SHARED between the
dialects: a repository’s number in a /api/v3 response and in a /api/v4
response is the same number.
Connecting
# python-gitlab
python3 -c "
import gitlab
gl = gitlab.Gitlab('https://git.example.org', private_token='TOKEN')
gl.auth(); print(gl.user.username)
"
# glab
glab auth login --hostname git.example.org --token TOKEN
# a server without TLS (an air-gapped network) — the protocol is set separately:
glab config set --host git.example.org:8099 api_protocol http
# Terraform
provider "gitlab" {
base_url = "https://git.example.org/api/v4/"
token = "TOKEN"
}
# curl
curl -H "PRIVATE-TOKEN: TOKEN" https://git.example.org/api/v4/user
The token is an ordinary GitRiver personal access token. Three forms are
accepted: PRIVATE-TOKEN: <…> (used by python-gitlab, glab, the Terraform
provider and the Jenkins plugin), Authorization: Bearer <…> and
Authorization: token <…>. The PRIVATE-TOKEN header is also accepted on
/api/v1.
Addressing a Project
A project is addressed two ways, same as GitLab:
- by number —
/api/v4/projects/12; - by full path with the slash encoded —
/api/v4/projects/group%2Fproject(a subgroup’s path has more segments:group%2Fsubgroup%2Fproject).
A group works the same way: /api/v4/groups/7 or /api/v4/groups/group.
A user is addressed by number or by account name.
Supported Calls
| Call | State |
|---|---|
GET /api/v4/version |
the server’s version; clients use it to check reachability |
GET /api/v4/metadata |
the same, in a newer shape |
GET /api/v4/user |
the token’s owner |
GET /api/v4/users |
account search; parameters username, search |
GET /api/v4/users/{id} |
profile; visibility follows the public_profiles setting |
GET /api/v4/users/{id}/projects |
the user’s projects visible to the client |
GET /api/v4/groups |
groups visible to the client; parameter search |
GET /api/v4/groups/{id} |
one group |
GET /api/v4/groups/{id}/projects |
the group’s projects visible to the client |
GET /api/v4/projects |
all projects on the server visible to the client; parameters owned, membership, search, order_by |
GET /api/v4/projects/{id} |
one project, with the client’s rights |
GET /api/v4/projects/{id}/repository/branches |
branches, paginated; parameter search |
GET /api/v4/projects/{id}/repository/branches/{branch} |
one branch |
GET /api/v4/projects/{id}/repository/commits |
commits; parameters ref_name, path |
GET /api/v4/projects/{id}/repository/commits/{sha} |
one commit |
GET /api/v4/projects/{id}/repository/tree |
tree; parameters path, ref, recursive |
GET /api/v4/projects/{id}/repository/files/{path} |
a file, with contents in base64; parameter ref |
GET /api/v4/projects/{id}/repository/files/{path}/raw |
the raw file |
GET /api/v4/projects/{id}/issues |
issues; parameter state |
POST /api/v4/projects/{id}/issues |
create an issue |
GET /api/v4/projects/{id}/issues/{iid} |
one issue |
PUT /api/v4/projects/{id}/issues/{iid} |
edit; state_event=close|reopen |
GET /api/v4/projects/{id}/issues/{iid}/notes |
notes |
POST /api/v4/projects/{id}/issues/{iid}/notes |
add a note |
GET /api/v4/projects/{id}/merge_requests |
merge requests; parameter state |
POST /api/v4/projects/{id}/merge_requests |
create a merge request |
GET /api/v4/projects/{id}/merge_requests/{iid} |
one merge request |
PUT /api/v4/projects/{id}/merge_requests/{iid} |
edit; state_event=close|reopen |
PUT /api/v4/projects/{id}/merge_requests/{iid}/merge |
merge; parameter squash |
GET /api/v4/projects/{id}/merge_requests/{iid}/notes |
notes |
POST /api/v4/projects/{id}/merge_requests/{iid}/notes |
add a note |
GET /api/v4/projects/{id}/releases |
releases; drafts only for those who can write |
POST /api/v4/projects/{id}/releases |
create a release (the tag must exist) |
GET /api/v4/projects/{id}/releases/{tag_name} |
a release by tag |
GET /api/v4/projects/{id}/pipelines |
pipelines; parameters status, ref |
GET /api/v4/projects/{id}/pipelines/{id} |
one pipeline |
GET /api/v4/projects/{id}/pipelines/{id}/jobs |
the pipeline’s jobs |
Mutating calls behave the same as the same actions through /api/v1:
permission checks, webhooks, channel notifications, notifications and an
activity feed entry. A merge obeys branch protection rules and the
merge-allowed list.
Not yet supported: project and group members, labels and milestones as
separate calls, threaded discussions (discussions), starting and
cancelling pipelines, CI jobs as separate calls, release attachments,
webhooks, CI variables, repository/compare, snippets, epics and GraphQL.
Pagination
Same as GitLab: page (starting at 1) and per_page (default 20, capped
at 100) parameters. Adjacent pages come both in the Link header (RFC 8288)
and in GitLab’s counters:
| Header | Value |
|---|---|
X-Page |
the current page number |
X-Per-Page |
the page size |
X-Next-Page |
the next page’s number; empty on the last page, as on GitLab |
X-Prev-Page |
the previous page’s number; empty on the first |
X-Total |
total records — where the total is known (see below) |
X-Total-Pages |
total pages — same places |
Browser clients can see these headers: the CORS policy exposes them explicitly.
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.
X-Total and X-Total-Pages are not set on commit history and the
recursive tree. GitLab itself omits these headers when counting is disabled,
too. Walk a listing via X-Next-Page — it is present everywhere.
What Still Depends on Volume
The cost of a commit history page (repository/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 (repository/tree?recursive=true) is capped at ten
thousand entries: a page past that limit is rejected with 400 and a clear
reason. GitLab itself does the same. The path parameter narrows the
selection.
Errors
The error body is {"message": "…"}, as on GitLab. Every failure of the
layer takes this shape, including a nonexistent address, a wrong method, a
response timeout and exceeding the rate limit.
The texts of 401, 404 and 405 are canonical (401 Unauthorized,
404 Not Found, 405 Method Not Allowed), with the code number up front,
as on GitLab. The detail of what exactly was not found is written to the
server log, not the body. Other failures carry a substantive text.
An inaccessible object answers 404 with the same body as a nonexistent
address: closed is indistinguishable from nonexistent. GitLab 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 project,
a token without the needed scope, an edition limit.
Difference from the GitHub dialect: an entity that fails validation is
returned with code 400, not 422 — same as GitLab and as in /api/v1.
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 GitLab, 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 /users/{id} |
visibility is decided by the server setting public_profiles; profiles are closed 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, merge request, review and release is always returned, regardless of the setting |
access_level |
20 Reporter, 30 Developer, 40 Maintainer |
there is no level 50 (Owner): GitRiver has no owner role distinct from a repository administrator |
project visibility |
only public and private |
GitRiver’s repository has no intermediate internal visibility. Groups have all three |
last_activity_at |
equals the last-edit time | GitRiver keeps no separate activity record |
a project’s avatar_url |
null |
GitRiver has no image uploads, and identicons exist only for users and groups. null means “no picture” |
| labels | an array of names | same as GitLab: a label there is a name, not an object. There are no separate label-management calls yet |
a milestone’s state |
active / closed |
GitLab’s values; in /api/v1 the same states are called open / closed |
pipeline state canceled |
spelled with one “l” | GitLab’s spelling; compare against the string canceled, not cancelled |
| a pipeline queued in its own group | waiting_for_resource |
on GitLab this is waiting on resource_group; ours is a concurrency group (concurrency) — the meaning is the same: the build waits for another one from the same group to finish |
a pipeline job’s id |
jobs have their own numbering | a job’s number is unique among jobs and unrelated to the pipeline’s number — same as GitLab |
| creating a merge request from a fork | not supported | on GitLab this is target_project_id in the body; /api/v3 has a way (head in owner:branch form) |
POST /projects/{id}/releases |
draft and pre-release are not set | GitLab has no such flags in the body; they exist in /api/v1 and in the GitHub dialect |
files/{path} over 1 MB |
failure, pointing to /raw |
such a file is read via /raw: the raw endpoint has no such limit |
| a CI job token | acts as an anonymous client | a private project is unreachable with it; a tool needs a personal token |
pipelines/{id}/jobs |
returns all of a pipeline’s jobs at once | this call has no pagination |
How Fields Are Filled
| Field | Our behavior |
|---|---|
id |
an integer assigned to the object on first access and never changed afterward. Shared with the GitHub dialect: one object is one number in both responses |
%2F addressing |
the project’s path is accepted as a single parameter in full, subgroups included |
a user’s and a group’s avatar_url |
an identicon derived from the name (/avatars/{name}.svg) |
| time | ISO 8601 with milliseconds and Z — GitLab’s shape (in the GitHub dialect time is second-precision) |
a file’s content_sha256 |
a genuine checksum of the content; clients verify what they downloaded against it |
a file’s commit_id and last_commit_id |
the commit ref resolved to, and the last commit that changed the file — two different values, as on GitLab |
a tree’s recursive=true |
the listing holds both files and directories at every depth, as on GitLab |
a branch’s can_push |
accounts for both the client’s rights and branch protection: true only when the client’s push to this branch would be accepted |
| project capability flags | issues_enabled, merge_requests_enabled, wiki_enabled, jobs_enabled, container_registry_enabled, plus the same information as access levels. The client reads them BEFORE acting: glab issue create fails without issues_enabled, without attempting to create the issue. The values are genuine — in GitRiver a capability either exists for every project or does not exist at all (snippets_enabled is false) |
| boolean query parameters | accepted in loose form (True, 1, yes, on), the way GitLab itself understands them: python-gitlab sends the Python spelling recursive=False, and an ordinary tree walk works |
a merge request’s state |
a merged request has its own merged state (in the GitHub dialect it is closed with a merged flag) |
| page numbers on a group’s and a user’s project list | cost here too does not depend on the page number — same as the other paginated calls above |
Tested Clients
The layer works with python-gitlab and glab on every supported call,
including pagination: python-gitlab parses X-Next-Page itself.
What’s Guaranteed Separately From Response Shape
Addressing a project by number and by path gives the same result. Numeric
identifiers are stable across calls and across the /api/v3 and /api/v4
dialects — one repository’s id matches in both. Someone else’s private
repository is unreachable, header-based pagination works as described
above, and the profile visibility setting acts the same on /api/v1,
/api/v3 and /api/v4.
Differences in response fields
This list covers the names and types of response fields, nested ones included, compared with GitLab Community Edition 19.3.1; it does not describe field values.
The list below is complete as of the release date: 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: 218.
GitLab project settings that GitRiver does not have: auto DevOps, CI policies and strategies, import, service desk, image retention policy, storage selection, per-section access levels, merge message templates and merge method. No genuine value exists for them, and by the layer’s rule the field is omitted. In addition, owner, topics, open_issues_count, updated_at, readme_url and empty_repo are not returned, and namespace has no parent_id; project lists carry no permissions — the client’s rights come only in a response for a single project. A field leaves this list in the release where the layer starts returning it.
Fields
$._links.cluster_agents, $._links.events, $._links.labels, $._links.members,
$.allow_merge_on_skipped_pipeline, $.analytics_access_level, $.auto_cancel_pending_pipelines,
$.auto_devops_deploy_strategy, $.auto_devops_enabled, $.autoclose_referenced_issues,
$.build_git_strategy, $.build_timeout, $.can_create_merge_request_in,
$.ci_allow_fork_pipelines_to_run_in_parent_project, $.ci_config_path, $.ci_default_git_depth,
$.ci_delete_pipelines_in_seconds, $.ci_display_pipeline_variables,
$.ci_forward_deployment_enabled, $.ci_forward_deployment_rollback_allowed,
$.ci_id_token_sub_claim_components, $.ci_id_token_sub_claim_components[],
$.ci_job_token_scope_enabled, $.ci_pipeline_variables_minimum_override_role,
$.ci_push_repository_for_job_token_allowed, $.ci_separated_caches, $.cicd_catalog_enabled,
$.container_expiration_policy, $.container_expiration_policy.cadence,
$.container_expiration_policy.enabled, $.container_expiration_policy.keep_n,
$.container_expiration_policy.name_regex, $.container_expiration_policy.name_regex_keep,
$.container_expiration_policy.next_run_at, $.container_expiration_policy.older_than,
$.container_registry_access_level, $.creator_id, $.description_html, $.emails_disabled,
$.emails_enabled, $.empty_repo, $.enforce_auth_checks_on_uploads,
$.environments_access_level, $.feature_flags_access_level, $.forking_access_level,
$.group_runners_enabled, $.import_error, $.import_status, $.import_type, $.import_url,
$.infrastructure_access_level, $.issue_branch_template, $.keep_latest_artifact,
$.lfs_enabled, $.marked_for_deletion_at, $.marked_for_deletion_on, $.max_artifacts_size,
$.merge_commit_template, $.merge_method, $.model_experiments_access_level,
$.model_registry_access_level, $.monitor_access_level, $.mr_default_title_template,
$.namespace.parent_id, $.only_allow_merge_if_all_discussions_are_resolved,
$.only_allow_merge_if_pipeline_succeeds, $.open_issues_count, $.owner, $.owner.avatar_url,
$.owner.id, $.owner.locked, $.owner.name, $.owner.public_email, $.owner.state,
$.owner.username, $.owner.web_url, $.package_registry_access_level, $.packages_enabled,
$.pages_access_level, $.permissions.project_access.notification_level,
$.printing_merge_request_link_enabled, $.protect_merge_request_pipelines, $.public_jobs,
$.readme_url, $.releases_access_level, $.remove_source_branch_after_merge,
$.repository_object_format, $.repository_storage, $.request_access_enabled,
$.resolve_outdated_diff_discussions, $.resource_group_default_process_mode,
$.restrict_user_defined_variables, $.runner_token_expiration_interval, $.runners_token,
$.security_and_compliance_access_level, $.service_desk_address, $.service_desk_enabled,
$.shared_runners_enabled, $.shared_with_groups, $.show_diff_preview_in_email,
$.squash_commit_template, $.squash_option, $.suggestion_commit_message, $.tag_list,
$.topics, $.updated_at, $.warn_about_potentially_unwanted_characters,
$[]._links.cluster_agents, $[]._links.events, $[]._links.labels, $[]._links.members,
$[].allow_merge_on_skipped_pipeline, $[].analytics_access_level,
$[].auto_cancel_pending_pipelines, $[].auto_devops_deploy_strategy, $[].auto_devops_enabled,
$[].autoclose_referenced_issues, $[].build_git_strategy, $[].build_timeout,
$[].can_create_merge_request_in, $[].ci_allow_fork_pipelines_to_run_in_parent_project,
$[].ci_config_path, $[].ci_default_git_depth, $[].ci_delete_pipelines_in_seconds,
$[].ci_display_pipeline_variables, $[].ci_forward_deployment_enabled,
$[].ci_forward_deployment_rollback_allowed, $[].ci_id_token_sub_claim_components,
$[].ci_id_token_sub_claim_components[], $[].ci_job_token_scope_enabled,
$[].ci_pipeline_variables_minimum_override_role, $[].ci_push_repository_for_job_token_allowed,
$[].ci_separated_caches, $[].container_expiration_policy,
$[].container_expiration_policy.cadence, $[].container_expiration_policy.enabled,
$[].container_expiration_policy.keep_n, $[].container_expiration_policy.name_regex,
$[].container_expiration_policy.name_regex_keep, $[].container_expiration_policy.next_run_at,
$[].container_expiration_policy.older_than, $[].container_registry_access_level,
$[].creator_id, $[].description_html, $[].emails_disabled, $[].emails_enabled,
$[].empty_repo, $[].enforce_auth_checks_on_uploads, $[].environments_access_level,
$[].feature_flags_access_level, $[].forking_access_level, $[].group_runners_enabled,
$[].import_status, $[].import_type, $[].import_url, $[].infrastructure_access_level,
$[].issue_branch_template, $[].keep_latest_artifact, $[].lfs_enabled,
$[].marked_for_deletion_at, $[].marked_for_deletion_on, $[].max_artifacts_size,
$[].merge_commit_template, $[].merge_method, $[].model_experiments_access_level,
$[].model_registry_access_level, $[].monitor_access_level, $[].mr_default_title_template,
$[].namespace.parent_id, $[].only_allow_merge_if_all_discussions_are_resolved,
$[].only_allow_merge_if_pipeline_succeeds, $[].open_issues_count, $[].owner,
$[].owner.avatar_url, $[].owner.id, $[].owner.locked, $[].owner.name,
$[].owner.public_email, $[].owner.state, $[].owner.username, $[].owner.web_url,
$[].package_registry_access_level, $[].packages_enabled, $[].pages_access_level,
$[].permissions, $[].permissions.group_access, $[].permissions.group_access.access_level,
$[].permissions.group_access.notification_level, $[].permissions.project_access,
$[].permissions.project_access.access_level, $[].permissions.project_access.notification_level,
$[].printing_merge_request_link_enabled, $[].protect_merge_request_pipelines, $[].public_jobs,
$[].readme_url, $[].releases_access_level, $[].remove_source_branch_after_merge,
$[].repository_object_format, $[].repository_storage, $[].request_access_enabled,
$[].resolve_outdated_diff_discussions, $[].resource_group_default_process_mode,
$[].restrict_user_defined_variables, $[].runner_token_expiration_interval, $[].runners_token,
$[].security_and_compliance_access_level, $[].service_desk_address, $[].service_desk_enabled,
$[].shared_runners_enabled, $[].shared_with_groups, $[].show_diff_preview_in_email,
$[].squash_commit_template, $[].squash_option, $[].suggestion_commit_message, $[].tag_list,
$[].topics, $[].updated_at, $[].warn_about_potentially_unwanted_characters
We do not return it — all calls of this dialect, fields: 168.
GitLab group settings that GitRiver does not have: mandatory two-factor authentication, restrictions on creating subgroups and projects, artifact size, sharing with other groups, default branch protection, scheduled-deletion marks. In addition, full_name, default_branch and archived are not returned, nor is the shared_projects list in a response for a single group. A field leaves this list in the release where the layer starts returning it.
Fields
$.archived, $.auto_devops_enabled, $.crm_enabled, $.default_branch,
$.default_branch_protection, $.default_branch_protection_defaults,
$.default_branch_protection_defaults.allow_force_push,
$.default_branch_protection_defaults.allowed_to_merge,
$.default_branch_protection_defaults.allowed_to_merge[],
$.default_branch_protection_defaults.allowed_to_merge[].access_level,
$.default_branch_protection_defaults.allowed_to_push,
$.default_branch_protection_defaults.allowed_to_push[],
$.default_branch_protection_defaults.allowed_to_push[].access_level,
$.default_branch_protection_defaults.developer_can_initial_push, $.emails_disabled,
$.emails_enabled, $.enabled_git_access_protocol, $.full_name, $.lfs_enabled,
$.lock_math_rendering_limits_enabled, $.lock_resource_access_token_notify_inherited,
$.marked_for_deletion_on, $.math_rendering_limits_enabled, $.max_artifacts_size,
$.mentions_disabled, $.organization_id, $.prevent_sharing_groups_outside_hierarchy,
$.project_creation_level, $.projects[]._links.cluster_agents, $.projects[]._links.events,
$.projects[]._links.labels, $.projects[]._links.members,
$.projects[].allow_merge_on_skipped_pipeline, $.projects[].analytics_access_level,
$.projects[].auto_cancel_pending_pipelines, $.projects[].auto_devops_deploy_strategy,
$.projects[].auto_devops_enabled, $.projects[].autoclose_referenced_issues,
$.projects[].build_git_strategy, $.projects[].build_timeout,
$.projects[].can_create_merge_request_in,
$.projects[].ci_allow_fork_pipelines_to_run_in_parent_project, $.projects[].ci_config_path,
$.projects[].ci_default_git_depth, $.projects[].ci_delete_pipelines_in_seconds,
$.projects[].ci_display_pipeline_variables, $.projects[].ci_forward_deployment_enabled,
$.projects[].ci_forward_deployment_rollback_allowed,
$.projects[].ci_id_token_sub_claim_components, $.projects[].ci_id_token_sub_claim_components[],
$.projects[].ci_job_token_scope_enabled,
$.projects[].ci_pipeline_variables_minimum_override_role,
$.projects[].ci_push_repository_for_job_token_allowed, $.projects[].ci_separated_caches,
$.projects[].container_expiration_policy, $.projects[].container_expiration_policy.cadence,
$.projects[].container_expiration_policy.enabled,
$.projects[].container_expiration_policy.keep_n,
$.projects[].container_expiration_policy.name_regex,
$.projects[].container_expiration_policy.name_regex_keep,
$.projects[].container_expiration_policy.next_run_at,
$.projects[].container_expiration_policy.older_than,
$.projects[].container_registry_access_level, $.projects[].creator_id,
$.projects[].description_html, $.projects[].emails_disabled, $.projects[].emails_enabled,
$.projects[].empty_repo, $.projects[].enforce_auth_checks_on_uploads,
$.projects[].environments_access_level, $.projects[].feature_flags_access_level,
$.projects[].forking_access_level, $.projects[].group_runners_enabled,
$.projects[].import_status, $.projects[].import_type, $.projects[].import_url,
$.projects[].infrastructure_access_level, $.projects[].issue_branch_template,
$.projects[].keep_latest_artifact, $.projects[].lfs_enabled,
$.projects[].marked_for_deletion_at, $.projects[].marked_for_deletion_on,
$.projects[].max_artifacts_size, $.projects[].merge_commit_template,
$.projects[].merge_method, $.projects[].model_experiments_access_level,
$.projects[].model_registry_access_level, $.projects[].monitor_access_level,
$.projects[].mr_default_title_template, $.projects[].namespace.parent_id,
$.projects[].only_allow_merge_if_all_discussions_are_resolved,
$.projects[].only_allow_merge_if_pipeline_succeeds, $.projects[].open_issues_count,
$.projects[].package_registry_access_level, $.projects[].packages_enabled,
$.projects[].pages_access_level, $.projects[].printing_merge_request_link_enabled,
$.projects[].protect_merge_request_pipelines, $.projects[].public_jobs,
$.projects[].readme_url, $.projects[].releases_access_level,
$.projects[].remove_source_branch_after_merge, $.projects[].repository_object_format,
$.projects[].repository_storage, $.projects[].request_access_enabled,
$.projects[].resolve_outdated_diff_discussions,
$.projects[].resource_group_default_process_mode, $.projects[].restrict_user_defined_variables,
$.projects[].runner_token_expiration_interval, $.projects[].runners_token,
$.projects[].security_and_compliance_access_level, $.projects[].service_desk_address,
$.projects[].service_desk_enabled, $.projects[].shared_runners_enabled,
$.projects[].shared_with_groups, $.projects[].show_diff_preview_in_email,
$.projects[].squash_commit_template, $.projects[].squash_option,
$.projects[].suggestion_commit_message, $.projects[].tag_list, $.projects[].topics,
$.projects[].updated_at, $.projects[].warn_about_potentially_unwanted_characters,
$.request_access_enabled, $.require_two_factor_authentication,
$.resource_access_token_notify_inherited, $.runners_token, $.share_with_group_lock,
$.shared_projects, $.shared_runners_setting, $.shared_with_groups,
$.show_diff_preview_in_email, $.subgroup_creation_level, $.two_factor_grace_period,
$[].archived, $[].auto_devops_enabled, $[].crm_enabled, $[].default_branch,
$[].default_branch_protection, $[].default_branch_protection_defaults,
$[].default_branch_protection_defaults.allow_force_push,
$[].default_branch_protection_defaults.allowed_to_merge,
$[].default_branch_protection_defaults.allowed_to_merge[],
$[].default_branch_protection_defaults.allowed_to_merge[].access_level,
$[].default_branch_protection_defaults.allowed_to_push,
$[].default_branch_protection_defaults.allowed_to_push[],
$[].default_branch_protection_defaults.allowed_to_push[].access_level,
$[].default_branch_protection_defaults.developer_can_initial_push, $[].emails_disabled,
$[].emails_enabled, $[].full_name, $[].lfs_enabled, $[].lock_math_rendering_limits_enabled,
$[].lock_resource_access_token_notify_inherited, $[].marked_for_deletion_on,
$[].math_rendering_limits_enabled, $[].max_artifacts_size, $[].mentions_disabled,
$[].organization_id, $[].project_creation_level, $[].request_access_enabled,
$[].require_two_factor_authentication, $[].resource_access_token_notify_inherited,
$[].share_with_group_lock, $[].shared_runners_setting, $[].show_diff_preview_in_email,
$[].subgroup_creation_level, $[].two_factor_grace_period
We do not return it — all calls of this dialect, fields: 77.
GitLab profile fields that GitRiver’s member model does not have: bio, organization and job title, links to external networks, appearance preferences, project count limits, sign-in, external account and two-factor details. Email (email, public_email, commit_email), account creation time (created_at) and the administrator flag (is_admin) are not returned either. A field leaves this list in the release where the layer starts returning it.
Fields
$.bio, $.bio_html, $.bot, $.can_create_group, $.can_create_project, $.color_scheme_id,
$.commit_email, $.confirmed_at, $.created_at, $.created_by, $.current_sign_in_at,
$.current_sign_in_ip, $.discord, $.email, $.external, $.github, $.highest_role,
$.identities, $.is_admin, $.job_title, $.last_activity_on, $.last_sign_in_at,
$.last_sign_in_ip, $.linkedin, $.local_time, $.location, $.locked, $.namespace_id,
$.note, $.organization, $.preferred_language, $.private_profile, $.projects_limit,
$.pronouns, $.public_email, $.sign_in_count, $.theme_id, $.twitter,
$.two_factor_enabled, $.website_url, $.work_information, $[].bio, $[].bot,
$[].can_create_group, $[].can_create_project, $[].color_scheme_id, $[].commit_email,
$[].confirmed_at, $[].created_at, $[].created_by, $[].current_sign_in_at, $[].discord,
$[].email, $[].external, $[].github, $[].identities, $[].is_admin, $[].job_title,
$[].last_activity_on, $[].last_sign_in_at, $[].linkedin, $[].local_time, $[].location,
$[].locked, $[].namespace_id, $[].note, $[].organization, $[].preferred_language,
$[].private_profile, $[].projects_limit, $[].pronouns, $[].public_email, $[].theme_id,
$[].twitter, $[].two_factor_enabled, $[].website_url, $[].work_information
We do not return it — all calls of this dialect, fields: 19.
GitLab issue fields with no counterpart in GitRiver: who closed the issue (closed_by), the number of related merge requests (merge_requests_count), severity (severity), subscription (subscribed), the reactions and duplicate links in _links. The author has no locked or public_email. About the milestone: iid is its number within the project, and GitRiver has no numbering of its own for milestones; web_url would point to a milestone page, which does not exist in the interface. A field leaves this list in the release where the layer starts returning it.
Fields
$._links.award_emoji, $._links.closed_as_duplicate_of, $.author.locked,
$.author.public_email, $.closed_by, $.merge_requests_count, $.milestone.iid,
$.milestone.web_url, $.severity, $.subscribed, $[]._links.award_emoji,
$[]._links.closed_as_duplicate_of, $[].author.locked, $[].author.public_email,
$[].closed_by, $[].merge_requests_count, $[].milestone.iid, $[].milestone.web_url,
$[].severity
We do not return it — all calls of this dialect, fields: 64.
GitLab merge request fields with no counterpart in GitRiver: who merged and who closed the request (merged_by, merge_user, closed_by), commit squashing (squash, squash_on_merge, squash_commit_sha), auto-merge on pipeline success, merging no earlier than a set time (merge_after), merge error, first-contribution flag, build and first deployment times, subscription, resolved-discussions flag, the client’s rights (user). pipeline is not returned, and head_pipeline has no detailed status, own number, start and finish times, durations, run author, parse errors and several other fields. The author has no locked or public_email. A field leaves this list in the release where the layer starts returning it.
Fields
$.author.locked, $.author.public_email, $.blocking_discussions_resolved, $.closed_by,
$.first_contribution, $.first_deployed_to_production_at, $.head_pipeline.archived,
$.head_pipeline.before_sha, $.head_pipeline.committed_at, $.head_pipeline.coverage,
$.head_pipeline.detailed_status, $.head_pipeline.detailed_status.details_path,
$.head_pipeline.detailed_status.favicon, $.head_pipeline.detailed_status.group,
$.head_pipeline.detailed_status.has_details, $.head_pipeline.detailed_status.icon,
$.head_pipeline.detailed_status.illustration, $.head_pipeline.detailed_status.label,
$.head_pipeline.detailed_status.text, $.head_pipeline.detailed_status.tooltip,
$.head_pipeline.duration, $.head_pipeline.finished_at, $.head_pipeline.iid,
$.head_pipeline.queued_duration, $.head_pipeline.started_at, $.head_pipeline.tag,
$.head_pipeline.updated_at, $.head_pipeline.user, $.head_pipeline.user.avatar_url,
$.head_pipeline.user.id, $.head_pipeline.user.locked, $.head_pipeline.user.name,
$.head_pipeline.user.public_email, $.head_pipeline.user.state, $.head_pipeline.user.username,
$.head_pipeline.user.web_url, $.head_pipeline.yaml_errors, $.latest_build_finished_at,
$.latest_build_started_at, $.merge_after, $.merge_error, $.merge_user,
$.merge_when_pipeline_succeeds, $.merged_by, $.pipeline, $.prepared_at, $.squash,
$.squash_commit_sha, $.squash_on_merge, $.subscribed, $.user, $.user.can_merge,
$[].author.locked, $[].author.public_email, $[].blocking_discussions_resolved,
$[].closed_by, $[].merge_after, $[].merge_user, $[].merge_when_pipeline_succeeds,
$[].merged_by, $[].prepared_at, $[].squash, $[].squash_commit_sha, $[].squash_on_merge
We do not return it — all calls of this dialect, fields: 2.
A note’s author has no locked or public_email. A field leaves this list in the release where the layer starts returning it.
Fields
$[].author.locked, $[].author.public_email
We do not return it — all calls of this dialect, fields: 28.
A branch’s nested commit carries only id and short_id: the full commit comes from GET /projects/{id}/repository/commits/{sha}. A field leaves this list in the release where the layer starts returning it.
Fields
$.commit.author_email, $.commit.author_name, $.commit.authored_date,
$.commit.committed_date, $.commit.committer_email, $.commit.committer_name,
$.commit.created_at, $.commit.extended_trailers, $.commit.message, $.commit.parent_ids,
$.commit.parent_ids[], $.commit.title, $.commit.trailers, $.commit.web_url,
$[].commit.author_email, $[].commit.author_name, $[].commit.authored_date,
$[].commit.committed_date, $[].commit.committer_email, $[].commit.committer_name,
$[].commit.created_at, $[].commit.extended_trailers, $[].commit.message,
$[].commit.parent_ids, $[].commit.parent_ids[], $[].commit.title, $[].commit.trailers,
$[].commit.web_url
We do not return it — all calls of this dialect, fields: 2.
A commit’s last pipeline (last_pipeline) has no own number iid and no edit time updated_at. A field leaves this list in the release where the layer starts returning it.
Fields
$.last_pipeline.iid, $.last_pipeline.updated_at
We do not return it — all calls of this dialect, fields: 62.
A release has no nested commit (commit), no commit_path address and no evidences (evidences) — GitRiver has no signed release attestation. _links has no edit link and no links to the lists of related issues and merge requests. The author has no locked or public_email. A field leaves this list in the release where the layer starts returning it.
Fields
$._links.closed_issues_url, $._links.closed_merge_requests_url, $._links.edit_url,
$._links.merged_merge_requests_url, $._links.opened_issues_url,
$._links.opened_merge_requests_url, $.author.locked, $.author.public_email, $.commit,
$.commit.author_email, $.commit.author_name, $.commit.authored_date,
$.commit.committed_date, $.commit.committer_email, $.commit.committer_name,
$.commit.created_at, $.commit.extended_trailers, $.commit.id, $.commit.message,
$.commit.parent_ids, $.commit.parent_ids[], $.commit.short_id, $.commit.title,
$.commit.trailers, $.commit.web_url, $.commit_path, $.evidences, $.evidences[],
$.evidences[].collected_at, $.evidences[].filepath, $.evidences[].sha,
$[]._links.closed_issues_url, $[]._links.closed_merge_requests_url, $[]._links.edit_url,
$[]._links.merged_merge_requests_url, $[]._links.opened_issues_url,
$[]._links.opened_merge_requests_url, $[].author.locked, $[].author.public_email,
$[].commit, $[].commit.author_email, $[].commit.author_name, $[].commit.authored_date,
$[].commit.committed_date, $[].commit.committer_email, $[].commit.committer_name,
$[].commit.created_at, $[].commit.extended_trailers, $[].commit.id, $[].commit.message,
$[].commit.parent_ids, $[].commit.parent_ids[], $[].commit.short_id, $[].commit.title,
$[].commit.trailers, $[].commit.web_url, $[].commit_path, $[].evidences, $[].evidences[],
$[].evidences[].collected_at, $[].evidences[].filepath, $[].evidences[].sha
We do not return it — all calls of this dialect, fields: 80.
GitLab pipeline fields with no counterpart in GitRiver: the own project-scoped number (iid), edit time, coverage, file parse errors (yaml_errors), detailed status, queue duration, before_sha, committed_at, tag, the archived flag; the run author card (user) is not returned. Jobs have no runner details (runner), artifacts, tags, edit time, nested commit, project or run author; the nested pipeline has no iid or updated_at. A field leaves this list in the release where the layer starts returning it.
Fields
$.archived, $.before_sha, $.committed_at, $.coverage, $.detailed_status,
$.detailed_status.details_path, $.detailed_status.favicon, $.detailed_status.group,
$.detailed_status.has_details, $.detailed_status.icon, $.detailed_status.illustration,
$.detailed_status.label, $.detailed_status.text, $.detailed_status.tooltip, $.iid,
$.queued_duration, $.tag, $.updated_at, $.user, $.user.avatar_url, $.user.id,
$.user.locked, $.user.name, $.user.public_email, $.user.state, $.user.username,
$.user.web_url, $.yaml_errors, $[].archived, $[].artifacts, $[].commit,
$[].commit.author_email, $[].commit.author_name, $[].commit.authored_date,
$[].commit.committed_date, $[].commit.committer_email, $[].commit.committer_name,
$[].commit.created_at, $[].commit.extended_trailers, $[].commit.id, $[].commit.message,
$[].commit.parent_ids, $[].commit.parent_ids[], $[].commit.short_id, $[].commit.title,
$[].commit.trailers, $[].commit.web_url, $[].iid, $[].pipeline.iid,
$[].pipeline.updated_at, $[].project, $[].project.ci_job_token_scope_enabled, $[].runner,
$[].tag_list, $[].updated_at, $[].user, $[].user.avatar_url, $[].user.bio, $[].user.bot,
$[].user.created_at, $[].user.discord, $[].user.followers, $[].user.following,
$[].user.github, $[].user.id, $[].user.job_title, $[].user.linkedin, $[].user.local_time,
$[].user.location, $[].user.locked, $[].user.name, $[].user.organization,
$[].user.pronouns, $[].user.public_email, $[].user.state, $[].user.twitter,
$[].user.username, $[].user.web_url, $[].user.website_url, $[].user.work_information
We do not return it — all calls of this dialect, fields: 5.
The /metadata response carries no information about GitLab’s Kubernetes agent (kas): GitRiver has no such agent. A field leaves this list in the release where the layer starts returning it.
Fields
$.kas, $.kas.enabled, $.kas.externalK8sProxyUrl, $.kas.externalUrl, $.kas.version