makeplane/plane · error · ValidationError
Slug is not valid
Error message
Slug is not valid
What it means
Django ValidationError raised by `slug_validator` (workspace.py:113) when the proposed workspace slug is in the `RESTRICTED_WORKSPACE_SLUGS` list. That list (constants.py) reserves route-collision names such as `404`, `accounts`, `api`, `admin`, `sign-in`, `settings`, `profile`, `pages`, `billing`, `instance`, and ~60 others. The comparison is case-sensitive exact match.
Source
Thrown at apps/api/plane/db/models/workspace.py:116
"key": True,
"labels": True,
"link": True,
"priority": True,
"start_date": True,
"state": True,
"sub_issue_count": True,
"updated_on": True,
}
}
def get_issue_props():
return {"subscribed": True, "assigned": True, "created": True, "all_issues": True}
def slug_validator(value):
if value in RESTRICTED_WORKSPACE_SLUGS:
raise ValidationError("Slug is not valid")
class Workspace(BaseModel):
TIMEZONE_CHOICES = tuple(zip(pytz.common_timezones, pytz.common_timezones))
name = models.CharField(max_length=80, verbose_name="Workspace Name")
logo = models.TextField(verbose_name="Logo", blank=True, null=True)
logo_asset = models.ForeignKey(
"db.FileAsset",
on_delete=models.SET_NULL,
related_name="workspace_logo",
blank=True,
null=True,
)
owner = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE,
related_name="owner_workspace",View on GitHub (pinned to 1c8a60f858)
Solutions
- Pick a slug not present in RESTRICTED_WORKSPACE_SLUGS - suffix it (e.g. `pages-team`, `admin-org`).
- Check the reserved list at plane/utils/constants.py before submitting a slug.
- Note matching is exact and case-sensitive, so `Admin` would currently pass - but rely on a clearly distinct slug rather than the case difference.
- If a reserved slug is genuinely required, edit RESTRICTED_WORKSPACE_SLUGS (but verify no frontend route collision first).
Example fix
// before slug = "admin" // after slug = "admin-team"
Defensive patterns
Strategy: validation
Validate before calling
from plane.utils.constants import RESTRICTED_WORKSPACE_SLUGS
def is_reserved_slug(slug: str) -> bool:
# mirrors workspace.py:115 slug_validator (exact, case-sensitive)
return slug in RESTRICTED_WORKSPACE_SLUGS Try / catch
from django.core.exceptions import ValidationError
try:
workspace.full_clean()
except ValidationError as e:
if 'Slug is not valid' in str(e):
suggest_alternative(slug) Prevention
- Check the slug against RESTRICTED_WORKSPACE_SLUGS before submitting.
- Suffix reserved-collision slugs (e.g. 'admin-team').
- Treat the list as exact-match; prefer clearly distinct slugs.
When it happens
Trigger: Creating or renaming a Workspace whose slug exactly equals a reserved entry (e.g. `admin`, `api`, `settings`, `sign-in`, `pages`). Triggered through the workspace create/rename serializer and model validator.
Common situations: A company named 'Pages' or 'Admin' trying to use their natural slug; importing orgs whose names collide with reserved routes; users picking slugs like `billing` or `profile` that the frontend also uses.
Related errors
- Member not found
- Missing required fields.
- Workspace not found
- Invalid file type. Please select an image.
- Invalid expression: empty or null data
AI-assisted analysis of makeplane/plane@1c8a60f858 (2026-08-12).
Data as JSON: /api/errors/7eb0594699b4dd54.
Report an issue: GitHub.