Lesstep
GitLab.com and Self-Managed · REST API · Checked October 24, 2026

GitLab: 404 "Project Not Found"

GitLab gives the same answer when there is no project at that path and when there is one you are not allowed to see: it does not tell a private project apart from a missing one. So the fix is either the address or the access. A token that is wrong in itself gets 401 instead ("invalid_token" or "401 Unauthorized"), and a token that lacks a scope gets 403 "insufficient_scope".

The whole answer

On October 24, 2026, from gitlab.com without a token:

curl -i "https://gitlab.com/api/v4/projects/no-such-group%2Fno-such-project"

HTTP/1.1 404 Not Found
{"message":"404 Project Not Found"}

A project's merge requests and pipelines (/projects/:id/merge_requests, /projects/:id/pipelines) answer the same. In GitLab's source (lib/api/helpers.rb, find_project!), a project that does not exist and a project the caller cannot read both end in not_found!('Project'). GitLab's status codes say the same of 404: an ID could not be found, or the user is not authorized to access the resource. GitLab's GraphQL API does not answer 404 at all: it gives {"data":{"project":null}} for both.

"404 Project Not Found" or "404 Not Found"

When the project is there

To check whether a token can see the project:

curl -i --header "PRIVATE-TOKEN: your-token" "https://gitlab.com/api/v4/projects/your-group%2Fyour-project"

200 with the project means that it can; then look at the address the failing tool uses. On a Self-Managed server, use its address instead of gitlab.com.

When the address is wrong

Renamed or moved projects

These do not answer 404 with the old path. A read (GET) answers 301 to the project's numeric ID, which stays the same when the path changes: on October 24, 2026, /api/v4/projects/gitlab-org%2Fgitlab-ce answered 301 to /api/v4/projects/13083. Anything else, such as approving, commenting or merging, answers 405 Non GET methods are not allowed for moved projects (the same find_project!). GraphQL does not follow the old path: project(fullPath: "gitlab-org/gitlab-ce") answered null on the same day. Use the new path.

GitLab merge requests and pipelines in IntelliJ IDEA

Lesstep makes two plugins for JetBrains IDEs 2024.1 or later: Merge Request Inbox for GitLab and Pipeline Inbox for GitLab CI. They take the project's full path, subgroups included, from its Git remote and encode it themselves. When GitLab shows them no project there, they say that the project is private or does not exist and offer to add a token when there is none; with a token, they say that the token cannot see a project at that path. Both offer to open their settings. Opened from a clone that still has a renamed or moved project's old path, both ask GitLab where the project is now and use that: the merge request plugin for approving, commenting, merging and requesting changes (from version 1.0.13), the pipeline plugin for its list and for retrying, cancelling and running (from version 1.0.14). Reading is free; approving, commenting and merging, or retrying, cancelling and running pipelines, are Pro (US$1.50 a month, with a 30-day trial).

GITLAB is a trademark of GitLab Inc.; IntelliJ IDEA is a trademark of JetBrains s.r.o. This page is not affiliated with or endorsed by GitLab Inc. or JetBrains.

More: GitLab 404 "Group Not Found" · GitLab 401 "invalid_token" · GitLab "insufficient_scope" · GitLab merge refused (405, 409, 422) · GitLab approval refused (401, 409) · GitLab comment or thread refused (400, 403) · GitLab merge request not created (409, 422, 400) · GitLab rebase refused or failed (403, 409) · GitLab merge request list refused (400, 404) · GitLab merge request changes cut short ("1000+", too_large) · GitLab 429 "Retry later" (rate limits) · GitLab "compare_timeout": true (diff limits) · GitLab merge request plugins for IntelliJ IDEA, compared · GitLab pipelines in JetBrains IDEs, compared · 日本語