BerriAI/litellm · error · HTTPException
You are not allowed to access this key's info. Your role={us
Error message
You are not allowed to access this key's info. Your role={user_api_key_dict.user_role} What it means
After finding the key row, GET /key/info runs _can_user_query_key_info: access is granted to proxy admins (and view-only admins), the caller whose own api_key equals the queried key, users matching the key's user_id, or members of the key's team. Everyone else gets this 403 naming their role. It prevents users from enumerating other users' key details (spend, limits, metadata).
Source
Thrown at litellm/proxy/management_endpoints/key_management_endpoints.py:3690
include={"litellm_budget_table": True},
)
if key_info is None:
raise ProxyException(
message="Key not found in database",
type=ProxyErrorTypes.not_found_error,
param="key",
code=status.HTTP_404_NOT_FOUND,
)
if (
await _can_user_query_key_info(
user_api_key_dict=user_api_key_dict,
key=key,
key_info=key_info,
)
is not True
):
raise HTTPException(
status_code=status.HTTP_403_FORBIDDEN,
detail=f"You are not allowed to access this key's info. Your role={user_api_key_dict.user_role}",
)
## REMOVE HASHED TOKEN INFO BEFORE RETURNING ##
try:
key_info = key_info.model_dump()
except Exception:
# if using pydantic v1
key_info = key_info.dict()
key_token_hash: Final = key_info.pop("token")
model_max_budget = key_info.get("model_max_budget") or {}
budget_table: Final = key_info.get("litellm_budget_table") or {}
if not model_max_budget and isinstance(budget_table, dict):
model_max_budget = budget_table.get("model_max_budget") or {}
if model_max_budget and key_token_hash:
key_info["model_max_budget_usage"] = await _build_model_max_budget_usage(
api_key_hash=key_token_hash,View on GitHub (pinned to 77b7c6c40c)
Solutions
- Query only your own key (omit the key param — it defaults to the Authorization key).
- Use a proxy admin (master) key when you legitimately need other users' key info.
- For team keys, ensure the calling user is a member of that team first (POST /team/member_add).
Example fix
# before
client.headers["Authorization"] = "Bearer sk-regular-user"
client.get("/key/info", params={"key": "sk-someone-else"})
# after (admin needs others' info)
client.headers["Authorization"] = "Bearer sk-master"
client.get("/key/info", params={"key": "sk-someone-else"}) Defensive patterns
Strategy: validation
Validate before calling
# Only query keys you're permitted to see:
# - your own key (omit the key param), or
# - keys of a team you belong to (check membership first), or
# - use a proxy-admin key for arbitrary lookups.
def can_query(client, role: str, own_key: str, target_key: str) -> bool:
return role in ("proxy_admin", "proxy_admin_view_only") or own_key == target_key Try / catch
try:
info = client.get("/key/info", params={"key": key})
info.raise_for_status()
except HTTPError as e:
if e.response.status_code == 403 and "not allowed to access this key's info" in e.response.text:
return None # deliberately not our key; skip silently
raise Prevention
- Scope dashboards to the caller's own key or their teams' keys only.
- Use a dedicated admin credential for admin-wide key reporting tools.
- Remember the access rule: admin roles, key owner, key's user, or key's team members — no one else.
When it happens
Trigger: A normal user key calling GET /key/info?key=<someone else's key>; a user who left the team querying a team key they no longer belong to; an auditor-style service key with no team membership or admin role requesting arbitrary keys.
Common situations: Internal tooling built with a shared non-admin key trying to display all keys; team membership removed but cached client still queries old team keys; misunderstanding that key ownership (not just authentication) is enforced for info reads.
Related errors
- User={change_initiated_by.user_id} is not a Proxy Admin or T
- User={key.user_id} is not a member of the team={team.team_id
- Not all keys passed in were deleted. This probably means you
- Only proxy admins, team admins, or org admins can call {rout
- Unable to record skill ownership: caller has no identity sco
AI-assisted analysis of BerriAI/litellm@77b7c6c40c (2026-08-18).
Data as JSON: /api/errors/d1245b0dbc3c7ca7.
Report an issue: GitHub.