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

  1. Pick a slug not present in RESTRICTED_WORKSPACE_SLUGS - suffix it (e.g. `pages-team`, `admin-org`).
  2. Check the reserved list at plane/utils/constants.py before submitting a slug.
  3. Note matching is exact and case-sensitive, so `Admin` would currently pass - but rely on a clearly distinct slug rather than the case difference.
  4. 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

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


AI-assisted analysis of makeplane/plane@1c8a60f858 (2026-08-12). Data as JSON: /api/errors/7eb0594699b4dd54. Report an issue: GitHub.