BerriAI/litellm · error · ProxyException
callback_name = {data.callback_name} already exists in team_
Error message
callback_name = {data.callback_name} already exists in team_callback_settings, for team_id = {team_id} and event = {data.callback_type} What it means
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.
Source
Thrown at litellm/proxy/management_endpoints/team_callback_endpoints.py:309
# config (and read back the credentials they wrote).
await _verify_team_access(
team_obj=LiteLLM_TeamTable(**_existing_team.model_dump()),
user_api_key_dict=user_api_key_dict,
)
# store team callback settings in metadata
team_metadata = _existing_team.metadata
team_callback_settings: list[dict] = team_metadata.get("logging") # will be dict of type AddTeamCallback
if team_callback_settings is None or not isinstance(team_callback_settings, list):
team_callback_settings = []
## check if it already exists, for the same callback event
for callback in team_callback_settings:
if (
callback.get("callback_name") == data.callback_name
and callback.get("callback_type") == data.callback_type
):
raise ProxyException(
message=f"callback_name = {data.callback_name} already exists in team_callback_settings, for team_id = {team_id} and event = {data.callback_type}",
code=status.HTTP_400_BAD_REQUEST,
type=ProxyErrorTypes.bad_request_error,
param="callback_name",
)
before_metadata: Final = copy.deepcopy(team_metadata)
team_callback_settings.append(data.model_dump())
team_metadata["logging"] = team_callback_settings
team_metadata = encrypt_callback_vars(team_metadata)
team_metadata_json: Final = json.dumps(team_metadata) # update team_metadata
new_team_row: Final = await TeamRepository(prisma_client).table.update(
where={"team_id": team_id},
data={"metadata": team_metadata_json},
# `object_permission` is included so `_refresh_cached_team` doesn't
# write a cached team with the relation nulled out — seeView on GitHub (pinned to 77b7c6c40c)
Solutions
- Use a different callback_name, or update the existing callback for that team and event.
Defensive patterns
Strategy: validation
When it happens
Trigger: Thrown at litellm/proxy/management_endpoints/team_callback_endpoints.py:309 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of BerriAI/litellm@77b7c6c40c (2026-08-18).
Data as JSON: /api/errors/feae8dba43381028.
Report an issue: GitHub.