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"
{"message":"404 Project Not Found"}: GitLab read the address as a project and found none that you may see.{"error":"404 Not Found"}, without "Project": the address matched no API route. The usual cause is a project path with a plain slash./projects/gitlab-org/gitlabanswers this;/projects/gitlab-org%2Fgitlabworks. GitLab's REST API docs: the namespace and project path must be URL-encoded, with/as%2F, and if something in front of the API (for example, Apache) decodes it, the request does not match and answers 404.
When the project is there
- No token. Without one, GitLab shows only public projects. Any other answers 404, as if it did not exist.
- The token's account cannot see the project. It was never a member, or it was removed from the project or its group. A personal access token sees what its account sees.
- A project or group access token. A project access token's bot user is a member of its own project and cannot be added to any other (project access tokens). A group access token's bot user is a member of its group and inherits membership in its subgroups and projects (group access tokens). Any other private project answers 404.
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
- The path, not the name. GitLab's docs: a project's path is not necessarily the same as its name. It is in the project's URL, or in the project's settings under General > Advanced > Change path.
- The whole path. Groups nest, so the path is everything after the server in the project's URL, with every
/written as%2F:group%2Fsubgroup%2Fproject. - Another server. A project on your company's GitLab is not on gitlab.com, and the other way round.
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 · 日本語