Users, projects and tokens
Organisations
An organisation is a tenant. It owns its projects, quality profiles, quality gates, webhooks and
GitLab/GitHub connections. The first start creates the organisation default. The community edition
allows up to 3 organisations and has no limit on users, projects or lines of code. Most companies
need only default.
An instance admin creates more organisations through the API (POST /api/v0/organizations).
Users and roles
| Role | Can |
|---|---|
| Instance admin | everything, including users and organisations |
| Org admin | manage the organisation: projects, project tokens, quality profiles, gates, webhooks, GitLab/GitHub connections and members |
| Org member | read every project of the organisation and triage its issues: change a status, override a severity |
Instance admins manage users in Settings → Users: create users, reset passwords, deactivate users, and make or remove instance admins. A new user and a user whose password was reset must choose a new password at their next sign-in. Passwords have at least 12 characters, and sign-in is rate-limited.
Organisation membership and roles are managed through the API:
# role: "admin" or "member"
curl -fsS -X PUT -H "Authorization: Bearer $QUALOR_ADMIN_TOKEN" -H 'Content-Type: application/json' \
-d '{"role":"member"}' "$QUALOR_URL/api/v0/organizations/<org id>/members/<user id>"
SSO (SAML/OIDC), SCIM and fine-grained roles belong to the enterprise edition.
Projects
A project is one analysed codebase, usually one repository. A monorepo can hold several projects,
each with its own key and its own sources.include.
- Create one in Projects → New project, with a key and a name. Or let the first upload create it: this happens when the scan uses a personal token of an org admin with the Upload analyses scope.
- The key is what the scanner reports. It defaults to the CI project path (
CI_PROJECT_PATH,GITHUB_REPOSITORY). You can set it withproject.keyinqualor.yml,QUALOR_PROJECT_KEYor--project-key. Keys are unique on the instance. They may contain letters, digits,.,_,-,/and:. - The main branch is
mainby default. Every other branch and every merge request is compared with it. - Deleting a project needs its key as confirmation. The API call is
DELETE /api/v0/projects/<id>?confirm=<key>.
Some project settings have no screen in the UI yet. Set them with PATCH /api/v0/projects/<id> (the
project id is in the project’s URL), using a personal token with the Admin scope:
curl -fsS -X PATCH -H "Authorization: Bearer $QUALOR_ADMIN_TOKEN" -H 'Content-Type: application/json' \
-d '{"mainBranchName":"master","newCodeDefinition":{"type":"days","value":30}}' \
"$QUALOR_URL/api/v0/projects/<project id>"
| Field | Meaning |
|---|---|
name |
display name |
mainBranchName |
the default branch |
newCodeDefinition |
how new code is defined on the main branch; see Quality gates |
qualityGateId |
a gate for this project, or null for the organisation’s default gate |
scmConnectionId, scmProjectRef |
the GitLab/GitHub mapping. Settings → GitLab also sets it |
To assign a quality profile to one project, use PUT /api/v0/projects/<id>/quality-profiles/<language>
with the body {"profileId": "..."}. Send null to return that language to the organisation’s
default profile.
Tokens
Every token is shown once, when it is created. The server stores only a hash. Tokens look like
qlr_pat_… (personal) or qlr_prj_… (project). Qualor’s own Gitleaks configuration knows the qlr_
prefix, so a leaked token is reported as a secret.
Personal tokens
Settings → Access tokens → New token. You choose the scopes and, optionally, an expiry. Only a signed-in browser session can create a personal token, so a token can never create another one.
| Scope (UI) | API name | Allows |
|---|---|---|
| Read | read |
read the organisations you belong to |
| Write (triage issues) | write |
also change issues, profiles and gates, as far as your role allows |
| Admin | admin |
also everything your role allows administratively |
| Upload analyses | analysis:write |
upload analyses (what CI needs) |
A token has the rights that both its scopes and its user’s role allow.
Project analysis tokens
A project token can only upload analyses to its one project. It is the best token for CI. Create one with a personal token that has the Admin scope:
curl -fsS -X POST -H "Authorization: Bearer $QUALOR_ADMIN_TOKEN" -H 'Content-Type: application/json' \
-d '{"name":"gitlab-ci"}' "$QUALOR_URL/api/v0/projects/<project id>/tokens"
# → {"token":"qlr_prj_…", ...} store it as the masked CI variable QUALOR_TOKEN
List and revoke project tokens with GET and DELETE /api/v0/projects/<id>/tokens[/<token id>].
Which token where
| Use | Token |
|---|---|
| CI of one repository | a project analysis token |
| One CI token for many repositories, with projects created on first scan | a personal token (Upload analyses) of a dedicated bot user who is org admin |
| Scripts and automation (onboarding, reports) | a personal token with Read, Write or Admin, as needed |
qualor import sonarqube |
a personal token with Admin, of an org admin |
Keep QUALOR_TOKEN in the CI’s secret store: a masked GitLab variable, or a GitHub Actions secret.
Never put it in qualor.yml: the CLI refuses a config file that has a token key.