University of Amsterdam Internal User management API

The Internal User management API from University of Amsterdam — 10 operation(s) for internal user management.

Operations 10

POST /user/new New User #
GET /user/info User Info #
GET /v2/user/info User Info V2 #
POST /user/update User Update #
POST /user/bulk_update Bulk User Update #
GET /user/list Get Users #
POST /user/delete Delete User #
GET /user/daily/activity Get User Daily Activity #
GET /user/daily/activity/aggregated Get User Daily Activity Aggregated #
GET /user/available_users Available Enterprise Users #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/university-of-amsterdam-internal-user-management-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

university-of-amsterdam-internal-user-management-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: LiteLLM Internal User management API
  description: "Enterprise Edition \n\nProxy Server to call 100+ LLMs in the OpenAI format. [**Customize Swagger Docs**](https://docs.litellm.ai/docs/proxy/enterprise#swagger-docs---custom-routes--branding)\n\n\U0001F449 [```LiteLLM Admin Panel on /ui```](/ui). Create, Edit Keys with SSO. Having issues? Try [```Fallback Login```](/fallback/login)\n\n\U0001F4B8 [```LiteLLM Model Cost Map```](https://models.litellm.ai/).\n\n\U0001F50E [```LiteLLM Model Hub```](/ui/model_hub_table). See available models on the proxy. [**Docs**](https://docs.litellm.ai/docs/proxy/ai_hub)"
  version: 1.95.0
  x-operator: institution
  x-provenance:
    method: probed
    source: https://llmproxy.uva.nl/openapi.json
    retrieved: '2026-08-19'
    note: Document is generated by the LiteLLM proxy software the University of Amsterdam self-hosts; the deployment, the key issuance and the host (llmproxy.uva.nl, UvA Azure) are the institution's. servers[] added by API Evangelist because the served document omits it; nothing else altered.
servers:
- url: https://llmproxy.uva.nl
  description: University of Amsterdam / Amsterdam University of Applied Sciences shared AI gateway
tags:
- name: Internal User management
paths:
  /user/new:
    post:
      tags:
      - Internal User management
      summary: New User
      description: "Use this to create a new INTERNAL user with a budget.\nInternal Users can access LiteLLM Admin UI to make keys, request access to models.\nThis creates a new user and generates a new api key for the new user. The new api key is returned.\n\nReturns user id, budget + new key.\n\nParameters:\n- user_id: Optional[str] - Specify a user id. If not set, a unique id will be generated.\n- user_alias: Optional[str] - A descriptive name for you to know who this user id refers to.\n- teams: Optional[list] - specify a list of team id's a user belongs to.\n- user_email: Optional[str] - Specify a user email.\n- send_invite_email: Optional[bool] - Specify if an invite email should be sent.\n- user_role: Optional[str] - Specify a user role - \"proxy_admin\", \"proxy_admin_viewer\", \"internal_user\", \"internal_user_viewer\", \"team\", \"customer\". Info about each role here: `https://github.com/BerriAI/litellm/litellm/proxy/_types.py#L20`\n- max_budget: Optional[float] - Specify max budget for a given user.\n- budget_duration: Optional[str] - Budget is reset at the end of specified duration. If not set, budget is never reset. You can set duration as seconds (\"30s\"), minutes (\"30m\"), hours (\"30h\"), days (\"30d\"), months (\"1mo\").\n- models: Optional[list] - Model_name's a user is allowed to call. (if empty, key is allowed to call all models). Set to ['no-default-models'] to block all model access. Restricting user to only team-based model access.\n- tpm_limit: Optional[int] - Specify tpm limit for a given user (Tokens per minute)\n- rpm_limit: Optional[int] - Specify rpm limit for a given user (Requests per minute)\n- auto_create_key: bool - Default=True. Flag used for returning a key as part of the /user/new response\n- aliases: Optional[dict] - Model aliases for the user - [Docs](https://litellm.vercel.app/docs/proxy/virtual_keys#model-aliases)\n- config: Optional[dict] - [DEPRECATED PARAM] User-specific config.\n- allowed_cache_controls: Optional[list] - List of allowed cache control values. Example - [\"no-cache\", \"no-store\"]. See all values - https://docs.litellm.ai/docs/proxy/caching#turn-on--off-caching-per-request-\n- blocked: Optional[bool] - [Not Implemented Yet] Whether the user is blocked.\n- guardrails: Optional[List[str]] - [Not Implemented Yet] List of active guardrails for the user\n- policies: Optional[List[str]] - List of policy names to apply to the user. Policies define guardrails, conditions, and inheritance rules.\n- permissions: Optional[dict] - [Not Implemented Yet] User-specific permissions, eg. turning off pii masking.\n- metadata: Optional[dict] - Metadata for user, store information for user. Example metadata = {\"team\": \"core-infra\", \"app\": \"app2\", \"email\": \"ishaan@berri.ai\" }\n- max_parallel_requests: Optional[int] - Rate limit a user based on the number of parallel requests. Raises 429 error, if user's parallel requests > x.\n- soft_budget: Optional[float] - Get alerts when user crosses given budget, doesn't block requests.\n- model_max_budget: Optional[dict] - Model-specific max budget for user. [Docs](https://docs.litellm.ai/docs/proxy/users#add-model-specific-budgets-to-keys)\n- budget_fallbacks: Optional[Dict[str, List[str]]] - Per-model fallback chain tried in order when that model's own `model_max_budget` is exceeded, e.g. {\"gpt-4o\": [\"gpt-4o-mini\"]}.\n- model_rpm_limit: Optional[float] - Model-specific rpm limit for user. [Docs](https://docs.litellm.ai/docs/proxy/users#add-model-specific-limits-to-keys)\n- mcp_rpm_limit: Optional[dict] - Per-MCP-server rpm limit, keyed by MCP server name {\"github\": 100, \"slack\": 200}. Enforced for keys and teams only; values set on a user are stored but not enforced per user.\n- tag_rpm_limit: Optional[dict] - Per-request-tag rpm limit, keyed by request tag {\"cell-1\": 1000, \"cell-2\": 500}. Enforced for keys only; values set on a user are stored but not enforced per user.\n- model_tpm_limit: Optional[float] - Model-specific tpm limit for user. [Docs](https://docs.litellm.ai/docs/proxy/users#add-model-specific-limits-to-keys)\n- spend: Optional[float] - Amount spent by user. Default is 0. Will be updated by proxy whenever user is used. You can set duration as seconds (\"30s\"), minutes (\"30m\"), hours (\"30h\"), days (\"30d\"), months (\"1mo\").\n- agent_id: Optional[str] - The agent id associated with the user.\n- team_id: Optional[str] - [DEPRECATED PARAM] The team id of the user. Default is None.\n- duration: Optional[str] - Duration for the key auto-created on `/user/new`. Default is None.\n- key_alias: Optional[str] - Alias for the key auto-created on `/user/new`. Default is None.\n- sso_user_id: Optional[str] - The id of the user in the SSO provider.\n- object_permission: Optional[LiteLLM_ObjectPermissionBase] - internal user-specific object permission. Example - {\"vector_stores\": [\"vector_store_1\", \"vector_store_2\"]}. IF null or {} then no object permission.\n- prompts: Optional[List[str]] - List of allowed prompts for the user. If specified, the user will only be able to use these specific prompts.\n- organizations: List[str] - List of organization id's the user is a member of\n- budget_limits: Optional[list] - List of concurrent budget windows for the user. Each window specifies a budget_limit, time_period, and optional budget_duration. Example - [{\"budget_limit\": 10.0, \"time_period\": \"1d\"}, {\"budget_limit\": 50.0, \"time_period\": \"7d\"}].\nReturns:\n- key: (str) The generated api key for the user\n- expires: (datetime) Datetime object for when key expires.\n- user_id: (str) Unique user id - used for tracking spend across multiple keys for same user id.\n- max_budget: (float|None) Max budget for given user.\n\nUsage Example \n\n```shell\n curl -X POST \"http://localhost:4000/user/new\"      -H \"Content-Type: application/json\"      -H \"Authorization: Bearer sk-1234\"      -d '{\n     \"username\": \"new_user\",\n     \"email\": \"new_user@example.com\"\n }'\n```"
      operationId: new_user_user_new_post
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/NewUserRequest'
        required: true
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/NewUserResponse'
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
      security:
      - APIKeyHeader: []
  /user/info:
    get:
      tags:
      - Internal User management
      summary: User Info
      description: '[10/07/2024]

        Note: To get all users (+pagination), use `/user/list` endpoint.



        Use this to get user information. (user row + all user key info)


        Example request

        ```

        curl -X GET ''http://localhost:4000/user/info?user_id=krrish7%40berri.ai''     --header ''Authorization: Bearer sk-1234''

        ```'
      operationId: user_info_user_info_get
      security:
      - APIKeyHeader: []
      parameters:
      - name: user_id
        in: query
        required: false
        schema:
          anyOf:
          - type: string
          - type: 'null'
          description: User ID in the request parameters
          title: User Id
        description: User ID in the request parameters
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UserInfoResponse'
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /v2/user/info:
    get:
      tags:
      - Internal User management
      summary: User Info V2
      description: 'Lightweight endpoint to get user info. Returns only the user object — no keys, no teams objects.


        This is the v2 replacement for /user/info, designed to avoid the "god endpoint" problem

        where the old endpoint loaded all keys and teams into memory.


        Access control:

        - Proxy admins can query any user

        - Team admins can query users within their teams

        - Internal users can only query themselves (omit user_id or pass own)

        - Returns 404 for non-existent users or unauthorized access


        Example request:

        ```

        curl -X GET ''http://localhost:4000/v2/user/info?user_id=user123'' \

        --header ''Authorization: Bearer sk-1234''

        ```'
      operationId: user_info_v2_v2_user_info_get
      security:
      - APIKeyHeader: []
      parameters:
      - name: user_id
        in: query
        required: false
        schema:
          anyOf:
          - type: string
          - type: 'null'
          description: User ID in the request parameters
          title: User Id
        description: User ID in the request parameters
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UserInfoV2Response'
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /user/update:
    post:
      tags:
      - Internal User management
      summary: User Update
      description: "Example curl \n\n```\ncurl --location 'http://0.0.0.0:4000/user/update'     --header 'Authorization: Bearer sk-1234'     --header 'Content-Type: application/json'     --data '{\n    \"user_id\": \"test-litellm-user-4\",\n    \"user_role\": \"proxy_admin_viewer\"\n}'\n```\n\nParameters:\n    - user_id: Optional[str] - Specify a user id. If not set, a unique id will be generated.\n    - user_email: Optional[str] - Specify a user email.\n    - password: Optional[str] - Specify a user password.\n    - user_alias: Optional[str] - A descriptive name for you to know who this user id refers to.\n    - teams: Optional[list] - specify a list of team id's a user belongs to.\n    - send_invite_email: Optional[bool] - Specify if an invite email should be sent.\n    - user_role: Optional[str] - Specify a user role - \"proxy_admin\", \"proxy_admin_viewer\", \"internal_user\", \"internal_user_viewer\", \"team\", \"customer\". Info about each role here: `https://github.com/BerriAI/litellm/litellm/proxy/_types.py#L20`\n    - max_budget: Optional[float] - Specify max budget for a given user.\n    - budget_duration: Optional[str] - Budget is reset at the end of specified duration. If not set, budget is never reset. You can set duration as seconds (\"30s\"), minutes (\"30m\"), hours (\"30h\"), days (\"30d\"), months (\"1mo\").\n    - models: Optional[list] - Model_name's a user is allowed to call. (if empty, key is allowed to call all models)\n    - tpm_limit: Optional[int] - Specify tpm limit for a given user (Tokens per minute)\n    - rpm_limit: Optional[int] - Specify rpm limit for a given user (Requests per minute)\n    - auto_create_key: bool - Default=True. Flag used for returning a key as part of the /user/new response\n    - aliases: Optional[dict] - Model aliases for the user - [Docs](https://litellm.vercel.app/docs/proxy/virtual_keys#model-aliases)\n    - config: Optional[dict] - [DEPRECATED PARAM] User-specific config.\n    - allowed_cache_controls: Optional[list] - List of allowed cache control values. Example - [\"no-cache\", \"no-store\"]. See all values - https://docs.litellm.ai/docs/proxy/caching#turn-on--off-caching-per-request-\n    - blocked: Optional[bool] - [Not Implemented Yet] Whether the user is blocked.\n    - guardrails: Optional[List[str]] - [Not Implemented Yet] List of active guardrails for the user\n    - policies: Optional[List[str]] - List of policy names to apply to the user. Policies define guardrails, conditions, and inheritance rules.\n    - permissions: Optional[dict] - [Not Implemented Yet] User-specific permissions, eg. turning off pii masking.\n    - metadata: Optional[dict] - Metadata for user, store information for user. Example metadata = {\"team\": \"core-infra\", \"app\": \"app2\", \"email\": \"ishaan@berri.ai\" }\n    - max_parallel_requests: Optional[int] - Rate limit a user based on the number of parallel requests. Raises 429 error, if user's parallel requests > x.\n    - soft_budget: Optional[float] - Get alerts when user crosses given budget, doesn't block requests.\n    - model_max_budget: Optional[dict] - Model-specific max budget for user. [Docs](https://docs.litellm.ai/docs/proxy/users#add-model-specific-budgets-to-keys)\n    - budget_fallbacks: Optional[Dict[str, List[str]]] - Per-model fallback chain tried in order when that model's own `model_max_budget` is exceeded, e.g. {\"gpt-4o\": [\"gpt-4o-mini\"]}.\n    - model_rpm_limit: Optional[float] - Model-specific rpm limit for user. [Docs](https://docs.litellm.ai/docs/proxy/users#add-model-specific-limits-to-keys)\n    - mcp_rpm_limit: Optional[dict] - Per-MCP-server rpm limit, keyed by MCP server name {\"github\": 100, \"slack\": 200}. Enforced for keys and teams only; values set on a user are stored but not enforced per user.\n    - tag_rpm_limit: Optional[dict] - Per-request-tag rpm limit, keyed by request tag {\"cell-1\": 1000, \"cell-2\": 500}. Enforced for keys only; values set on a user are stored but not enforced per user.\n    - model_tpm_limit: Optional[float] - Model-specific tpm limit for user. [Docs](https://docs.litellm.ai/docs/proxy/users#add-model-specific-limits-to-keys)\n    - spend: Optional[float] - Amount spent by user. Default is 0. Will be updated by proxy whenever user is used. You can set duration as seconds (\"30s\"), minutes (\"30m\"), hours (\"30h\"), days (\"30d\"), months (\"1mo\").\n    - agent_id: Optional[str] - The agent id associated with the user.\n    - team_id: Optional[str] - [DEPRECATED PARAM] The team id of the user. Default is None.\n    - duration: Optional[str] - [NOT IMPLEMENTED].\n    - key_alias: Optional[str] - [NOT IMPLEMENTED].\n    - object_permission: Optional[LiteLLM_ObjectPermissionBase] - internal user-specific object permission. Example - {\"vector_stores\": [\"vector_store_1\", \"vector_store_2\"]}. IF null or {} then no object permission.\n    - prompts: Optional[List[str]] - List of allowed prompts for the user. If specified, the user will only be able to use these specific prompts.\n    - budget_limits: Optional[list] - List of concurrent budget windows for the user. Each window specifies a budget_limit, time_period, and optional budget_duration. Example - [{\"budget_limit\": 10.0, \"time_period\": \"1d\"}, {\"budget_limit\": 50.0, \"time_period\": \"7d\"}]."
      operationId: user_update_user_update_post
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UpdateUserRequest'
        required: true
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
      security:
      - APIKeyHeader: []
  /user/bulk_update:
    post:
      tags:
      - Internal User management
      summary: Bulk User Update
      description: "Bulk update multiple users at once.\n\nThis endpoint allows updating multiple users in a single request. Each user update\nis processed independently - if some updates fail, others will still succeed.\n\nParameters:\n- users: Optional[List[UpdateUserRequest]] - List of specific user update requests\n- all_users: Optional[bool] - Set to true to update all users in the system\n- user_updates: Optional[UpdateUserRequest] - Updates to apply when all_users=True\n\nReturns:\n- results: List of individual update results\n- total_requested: Total number of users requested for update\n- successful_updates: Number of successful updates\n- failed_updates: Number of failed updates\n\nExample request for specific users:\n```bash\ncurl --location 'http://0.0.0.0:4000/user/bulk_update'     --header 'Authorization: Bearer sk-1234'     --header 'Content-Type: application/json'     --data '{\n    \"users\": [\n        {\n            \"user_id\": \"user1\",\n            \"user_role\": \"internal_user\",\n            \"max_budget\": 100.0\n        },\n        {\n            \"user_email\": \"user2@example.com\", \n            \"user_role\": \"internal_user_viewer\",\n            \"max_budget\": 50.0\n        }\n    ]\n}'\n```\n\nExample request for all users:\n```bash\ncurl --location 'http://0.0.0.0:4000/user/bulk_update'     --header 'Authorization: Bearer sk-1234'     --header 'Content-Type: application/json'     --data '{\n    \"all_users\": true,\n    \"user_updates\": {\n        \"user_role\": \"internal_user\",\n        \"max_budget\": 50.0\n    }\n}'\n```"
      operationId: bulk_user_update_user_bulk_update_post
      security:
      - APIKeyHeader: []
      parameters:
      - name: litellm-changed-by
        in: header
        required: false
        schema:
          anyOf:
          - type: string
          - type: 'null'
          description: The litellm-changed-by header enables tracking of actions performed by authorized users on behalf of other users, providing an audit trail for accountability
          title: Litellm-Changed-By
        description: The litellm-changed-by header enables tracking of actions performed by authorized users on behalf of other users, providing an audit trail for accountability
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/BulkUpdateUserRequest'
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BulkUpdateUserResponse'
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /user/list:
    get:
      tags:
      - Internal User management
      summary: Get Users
      description: "Get a paginated list of users with filtering and sorting options.\n\nParameters:\n    role: Optional[str]\n        Filter users by role. Can be one of:\n        - proxy_admin\n        - proxy_admin_viewer\n        - internal_user\n        - internal_user_viewer\n    user_ids: Optional[str]\n        Get list of users by user_ids. Comma separated list of user_ids.\n    sso_ids: Optional[str]\n        Get list of users by sso_ids. Comma separated list of sso_ids.\n    user_email: Optional[str]\n        Filter users by partial email match\n    team: Optional[str]\n        Filter users by team id. Will match if user has this team in their teams array.\n    page: int\n        The page number to return\n    page_size: int\n        The number of items per page\n    sort_by: Optional[str]\n        Column to sort by (e.g. 'user_id', 'user_email', 'created_at', 'spend')\n    sort_order: Optional[str]\n        Sort order ('asc' or 'desc')"
      operationId: get_users_user_list_get
      security:
      - APIKeyHeader: []
      parameters:
      - name: role
        in: query
        required: false
        schema:
          anyOf:
          - type: string
          - type: 'null'
          description: Filter users by role
          title: Role
        description: Filter users by role
      - name: user_ids
        in: query
        required: false
        schema:
          anyOf:
          - type: string
          - type: 'null'
          description: Get list of users by user_ids
          title: User Ids
        description: Get list of users by user_ids
      - name: sso_user_ids
        in: query
        required: false
        schema:
          anyOf:
          - type: string
          - type: 'null'
          description: Get list of users by sso_user_id
          title: Sso User Ids
        description: Get list of users by sso_user_id
      - name: user_email
        in: query
        required: false
        schema:
          anyOf:
          - type: string
          - type: 'null'
          description: Filter users by partial email match
          title: User Email
        description: Filter users by partial email match
      - name: team
        in: query
        required: false
        schema:
          anyOf:
          - type: string
          - type: 'null'
          description: Filter users by team id
          title: Team
        description: Filter users by team id
      - name: page
        in: query
        required: false
        schema:
          type: integer
          minimum: 1
          description: Page number
          default: 1
          title: Page
        description: Page number
      - name: page_size
        in: query
        required: false
        schema:
          type: integer
          maximum: 100
          minimum: 1
          description: Number of items per page
          default: 25
          title: Page Size
        description: Number of items per page
      - name: sort_by
        in: query
        required: false
        schema:
          anyOf:
          - type: string
          - type: 'null'
          description: Column to sort by (e.g. 'user_id', 'user_email', 'created_at', 'spend')
          title: Sort By
        description: Column to sort by (e.g. 'user_id', 'user_email', 'created_at', 'spend')
      - name: sort_order
        in: query
        required: false
        schema:
          type: string
          description: Sort order ('asc' or 'desc')
          default: asc
          title: Sort Order
        description: Sort order ('asc' or 'desc')
      - name: organization_ids
        in: query
        required: false
        schema:
          anyOf:
          - type: string
          - type: 'null'
          description: Filter users by organization membership. Comma-separated list of org IDs.
          title: Organization Ids
        description: Filter users by organization membership. Comma-separated list of org IDs.
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UserListResponse'
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /user/delete:
    post:
      tags:
      - Internal User management
      summary: Delete User
      description: "delete user and associated user keys\n\n```\ncurl --location 'http://0.0.0.0:4000/user/delete' \n--header 'Authorization: Bearer sk-1234' \n--header 'Content-Type: application/json' \n--data-raw '{\n    \"user_ids\": [\"45e3e396-ee08-4a61-a88e-16b3ce7e0849\"]\n}'\n```\n\nParameters:\n- user_ids: List[str] - The list of user id's to be deleted."
      operationId: delete_user_user_delete_post
      security:
      - APIKeyHeader: []
      parameters:
      - name: litellm-changed-by
        in: header
        required: false
        schema:
          anyOf:
          - type: string
          - type: 'null'
          description: The litellm-changed-by header enables tracking of actions performed by authorized users on behalf of other users, providing an audit trail for accountability
          title: Litellm-Changed-By
        description: The litellm-changed-by header enables tracking of actions performed by authorized users on behalf of other users, providing an audit trail for accountability
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/DeleteUserRequest'
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /user/daily/activity:
    get:
      tags:
      - Internal User management
      summary: Get User Daily Activity
      description: '[BETA] This is a beta endpoint. It will change.


        Meant to optimize querying spend data for analytics for a user.


        Returns:

        (by date)

        - spend

        - prompt_tokens

        - completion_tokens

        - cache_read_input_tokens

        - cache_creation_input_tokens

        - total_tokens

        - api_requests

        - breakdown by model, api_key, provider'
      operationId: get_user_daily_activity_user_daily_activity_get
      security:
      - APIKeyHeader: []
      parameters:
      - name: start_date
        in: query
        required: false
        schema:
          anyOf:
          - type: string
          - type: 'null'
          description: Start date in YYYY-MM-DD format
          title: Start Date
        description: Start date in YYYY-MM-DD format
      - name: end_date
        in: query
        required: false
        schema:
          anyOf:
          - type: string
          - type: 'null'
          description: End date in YYYY-MM-DD format
          title: End Date
        description: End date in YYYY-MM-DD format
      - name: model
        in: query
        required: false
        schema:
          anyOf:
          - type: string
          - type: 'null'
          description: Filter by specific model
          title: Model
        description: Filter by specific model
      - name: api_key
        in: query
        required: false
        schema:
          anyOf:
          - type: string
          - type: 'null'
          description: Filter by specific API key
          title: Api Key
        description: Filter by specific API key
      - name: user_id
        in: query
        required: false
        schema:
          anyOf:
          - type: string
          - type: 'null'
          description: Filter by specific user ID. Admins can filter by any user or omit for global view. Non-admins must provide their own user_id.
          title: User Id
        description: Filter by specific user ID. Admins can filter by any user or omit for global view. Non-admins must provide their own user_id.
      - name: page
        in: query
        required: false
        schema:
          type: integer
          minimum: 1
          description: Page number for pagination
          default: 1
          title: Page
        description: Page number for pagination
      - name: page_size
        in: query
        required: false
        schema:
          type: integer
          maximum: 1000
          minimum: 1
          description: Items per page
          default: 50
          title: Page Size
        description: Items per page
      - name: timezone
        in: query
        required: false
        schema:
          anyOf:
          - type: integer
          - type: 'null'
          description: Timezone offset in minutes from UTC (e.g., 480 for PST). Matches JavaScript's Date.getTimezoneOffset() convention.
          title: Timezone
        description: Timezone offset in minutes from UTC (e.g., 480 for PST). Matches JavaScript's Date.getTimezoneOffset() convention.
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SpendAnalyticsPaginatedResponse'
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /user/daily/activity/aggregated:
    get:
      tags:
      - Internal User management
      summary: Get User Daily Activity Aggregated
      description: 'Aggregated analytics for a user''s daily activity without pagination.

        Returns the same response shape as the paginated endpoint with page metadata set to single-page.'
      operationId: get_user_daily_activity_aggregated_user_daily_activity_aggregated_get
      security:
      - APIKeyHeader: []
      parameters:
      - name: start_date
        in: query
        required: false
        schema:
          anyOf:
          - type: string
          - type: 'null'
          description: Start date in YYYY-MM-DD format
          title: Start Date
        description: Start date in YYYY-MM-DD format
      - name: end_date
        in: query
        required: false
        schema:
          anyOf:
          - type: string
          - type: 'null'
          description: End date in YYYY-MM-DD format
          title: End Date
        description: End date in YYYY-MM-DD format
      - name: model
        in: query
        required: false
        schema:
          anyOf:
          - type: string
          - type: 'null'
          description: Filter by specific model
          title: Model
        description: Filter by specific model
      - name: api_key
        in: query
        required: false
        schema:
          anyOf:
          - type: string
          - type: 'null'
          description: Filter by specific API key
          title: Api Key
        description: Filter by specific API key
      - name: user_id
        in: query
        required: false
        schema:
          anyOf:
          - type: string
          - type: 'null'
          description: Filter by specific user ID. Admins can filter by any user or omit for global view. Non-admins must provide their own user_id.
          title: User Id
        description: Filter by specific user ID. Admins can filter by any user or omit for global view. Non-admins must provide their own user_id.
      - name: timezone
        in: query
        required: false
        schema:
          anyOf:
          - type: integer
          - type: 'null'
          description: Timezone offset in minutes from UTC (e.g., 480 for PST). Matches JavaScript's Date.getTimezoneOffset() convention.
          title: Timezone
        description: Timezone offset in minutes from UTC (e.g., 480 for PST). Matches JavaScript's Date.getTimezoneOffset() convention.
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SpendAnalyticsPaginatedResponse'
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /user/available_users:
    get:
      tags:
      - Internal User management
      summary: Available Enterprise Users
      description: For keys with `max_users` set, return the list of users that are allowed to use the key.
      operationId: available_enter

# --- truncated at 32 KB (85 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/university-of-amsterdam/refs/heads/main/openapi/university-of-amsterdam-internal-user-management-api-openapi.yml