{"record":{"id":"a80e3871e48bdf7b","repo":"getredash/redash","slug":"can-t-delete-built-in-groups","errorCode":null,"errorMessage":"Can't delete built-in groups.","messagePattern":"Can't delete built-in groups\\.","errorType":"http","errorClass":null,"httpStatus":400,"severity":"error","filePath":"redash/handlers/groups.py","lineNumber":61,"sourceCode":"        self.record_event({\"action\": \"edit\", \"object_id\": group.id, \"object_type\": \"group\"})\n\n        return group.to_dict()\n\n    def get(self, group_id):\n        if not (self.current_user.has_permission(\"admin\") or int(group_id) in self.current_user.group_ids):\n            abort(403)\n\n        group = models.Group.get_by_id_and_org(group_id, self.current_org)\n\n        self.record_event({\"action\": \"view\", \"object_id\": group_id, \"object_type\": \"group\"})\n\n        return group.to_dict()\n\n    @require_admin\n    def delete(self, group_id):\n        group = models.Group.get_by_id_and_org(group_id, self.current_org)\n        if group.type == models.Group.BUILTIN_GROUP:\n            abort(400, message=\"Can't delete built-in groups.\")\n\n        members = models.Group.members(group_id)\n        for member in members:\n            member.group_ids.remove(int(group_id))\n            models.db.session.add(member)\n\n        models.db.session.delete(group)\n        models.db.session.commit()\n\n\nclass GroupMemberListResource(BaseResource):\n    @require_admin\n    def post(self, group_id):\n        user_id = request.json[\"user_id\"]\n        user = models.User.get_by_id_and_org(user_id, self.current_org)\n        group = models.Group.get_by_id_and_org(group_id, self.current_org)\n        user.group_ids.append(group.id)\n        models.db.session.commit()","sourceCodeStart":43,"sourceCodeEnd":79,"githubUrl":"https://github.com/getredash/redash/blob/ca79fe988d81cdac9675b412f3dfcab107bc1fbc/redash/handlers/groups.py#L43-L79","documentation":"Raised by GroupResource.delete in redash/handlers/groups.py when attempting to delete a built-in group. Built-in groups (default, admin, etc.) anchor Redash's permission model and cannot be removed; attempting it returns 400.","triggerScenarios":"DELETE /api/groups/<id> where the group's type is Group.BUILTIN_GROUP.","commonSituations":"Cleanup scripts deleting every group in an org; test teardown deleting groups created by fixtures but accidentally targeting built-ins; org provisioning scripts assuming all groups are deletable.","solutions":["Filter out built-in groups before deleting; only custom groups can be removed.","If you want built-in groups empty, remove their members instead of deleting the group.","Assert group type != 'builtin' in test fixtures before delete calls."],"exampleFix":"# before\nclient.delete(f\"/api/groups/{group_id}\")\n\n# after\ngrp = client.get(f\"/api/groups/{group_id}\")\nif grp['type'] != 'builtin':\n    client.delete(f\"/api/groups/{group_id}\")","handlingStrategy":"validation","validationCode":"g = client.get(f'/api/groups/{gid}')\nif g['type'] != 'builtin':\n    client.delete(f'/api/groups/{gid}')","typeGuard":"def is_deletable_group(group: dict) -> bool:\n    return group.get('type') != 'builtin'","tryCatchPattern":null,"preventionTips":["In test teardown, track which groups your fixtures created and delete only those.","Never bulk-delete from GET /api/groups without filtering type."],"tags":["redash","groups","permissions","delete","builtin"],"backgroundTag":"immutable-builtin-resource","analyzedSha":"ca79fe988d81cdac9675b412f3dfcab107bc1fbc","analyzedAt":"2026-08-28T18:32:34.637Z","schemaVersion":2},"datasetVersion":"2026-08-28T21:17:43.275Z"}