BerriAI/litellm · error · HTTPException

User is not org_admin for Organization= {org_id}.

Error message

User is not org_admin for Organization= {org_id}.

What it means

Visibility guard on organization listing: for non-admin callers the results are filtered to organizations where they hold an org_admin membership (via OrganizationMembershipRepository lookups). This error surfaces when a requested org is outside that admin set, preventing org enumeration by non-admins.

Source

Thrown at litellm/proxy/management_endpoints/organization_endpoints.py:555

    org_ids_list = organization_ids.split(",") if organization_ids else None
    exclude_org_ids_list: list[str] | None = None
    if exclude_organization_ids:
        exclude_org_ids_list = exclude_organization_ids.split(",") if exclude_organization_ids else None

    # Restrict non-proxy-admins to only organizations where they are org_admin
    if not _user_has_admin_view(user_api_key_dict):
        memberships: Final = await _table(OrganizationMembershipRepository(prisma_client)).find_many(
            where={"user_id": user_api_key_dict.user_id}
        )
        admin_org_ids = [m.organization_id for m in memberships if m.user_role == LitellmUserRoles.ORG_ADMIN.value]
        if org_ids_list is None:
            # Default to orgs where user is org_admin
            org_ids_list = admin_org_ids
        else:
            # Ensure user is org_admin for all requested orgs
            for org_id in org_ids_list:
                if org_id not in admin_org_ids:
                    raise HTTPException(
                        status_code=403,
                        detail={"error": f"User is not org_admin for Organization= {org_id}."},
                    )

    # Fetch organization aliases for metadata
    where_condition: Final = _STR_OBJECT_DICT_ADAPTER.validate_python({})
    if org_ids_list:
        where_condition["organization_id"] = {"in": list(org_ids_list)}
    org_aliases: Final = await _table(OrganizationRepository(prisma_client)).find_many(where=where_condition)

    # Query daily activity for organizations
    return await get_daily_activity(
        prisma_client=prisma_client,
        table_name="litellm_dailyorganizationspend",
        entity_id_field="organization_id",
        entity_id=org_ids_list,
        entity_metadata_field={o.organization_id: {"organization_alias": o.organization_alias} for o in org_aliases},
        exclude_entity_ids=exclude_org_ids_list,

View on GitHub (pinned to 77b7c6c40c)

Solutions

  1. Use an org_admin key for this organization, or a PROXY_ADMIN key.
Defensive patterns

Strategy: validation

When it happens

Trigger: Thrown at litellm/proxy/management_endpoints/organization_endpoints.py:555 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/0efd9d0e4fbc7d3e. Report an issue: GitHub.