{"record":{"id":"feae8dba43381028","repo":"BerriAI/litellm","slug":"callback-name-data-callback-name-already-exist","errorCode":null,"errorMessage":"callback_name = {data.callback_name} already exists in team_callback_settings, for team_id = {team_id} and event = {data.callback_type}","messagePattern":"callback_name = (.+?) already exists in team_callback_settings, for team_id = (.+?) and event = (.+?)","errorType":"http","errorClass":"ProxyException","httpStatus":400,"severity":"error","filePath":"litellm/proxy/management_endpoints/team_callback_endpoints.py","lineNumber":309,"sourceCode":"        # config (and read back the credentials they wrote).\n        await _verify_team_access(\n            team_obj=LiteLLM_TeamTable(**_existing_team.model_dump()),\n            user_api_key_dict=user_api_key_dict,\n        )\n\n        # store team callback settings in metadata\n        team_metadata = _existing_team.metadata\n        team_callback_settings: list[dict] = team_metadata.get(\"logging\")  # will be dict of type AddTeamCallback\n        if team_callback_settings is None or not isinstance(team_callback_settings, list):\n            team_callback_settings = []\n\n        ## check if it already exists, for the same callback event\n        for callback in team_callback_settings:\n            if (\n                callback.get(\"callback_name\") == data.callback_name\n                and callback.get(\"callback_type\") == data.callback_type\n            ):\n                raise ProxyException(\n                    message=f\"callback_name = {data.callback_name} already exists in team_callback_settings, for team_id = {team_id} and event = {data.callback_type}\",\n                    code=status.HTTP_400_BAD_REQUEST,\n                    type=ProxyErrorTypes.bad_request_error,\n                    param=\"callback_name\",\n                )\n\n        before_metadata: Final = copy.deepcopy(team_metadata)\n        team_callback_settings.append(data.model_dump())\n\n        team_metadata[\"logging\"] = team_callback_settings\n        team_metadata = encrypt_callback_vars(team_metadata)\n        team_metadata_json: Final = json.dumps(team_metadata)  # update team_metadata\n\n        new_team_row: Final = await TeamRepository(prisma_client).table.update(\n            where={\"team_id\": team_id},\n            data={\"metadata\": team_metadata_json},\n            # `object_permission` is included so `_refresh_cached_team` doesn't\n            # write a cached team with the relation nulled out — see","sourceCodeStart":291,"sourceCodeEnd":327,"githubUrl":"https://github.com/BerriAI/litellm/blob/77b7c6c40c0c5aa5fbcb1d6a1825ac39ca8829b8/litellm/proxy/management_endpoints/team_callback_endpoints.py#L291-L327","documentation":"Before appending, the endpoint scans the team's metadata['logging'] list and finds a callback with the same callback_name and event type already registered for this team; adding a duplicate is refused with 400, directing callers to update instead.","triggerScenarios":"Thrown at litellm/proxy/management_endpoints/team_callback_endpoints.py:309 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Use a different callback_name, or update the existing callback for that team and event."],"exampleFix":null,"handlingStrategy":"validation","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"77b7c6c40c0c5aa5fbcb1d6a1825ac39ca8829b8","analyzedAt":"2026-08-18T11:44:31.656Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}