Skip to content
GitRiverGitRiver
RU
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