{"record":{"id":"9468359b02983cf1","repo":"BerriAI/litellm","slug":"project-project-object-project-id-is-blocked-up","errorCode":null,"errorMessage":"Project={project_object.project_id} is blocked. Update via `/project/update` if you're an admin.","messagePattern":"Project=(.+?) is blocked\\. Update via `/project/update` if you're an admin\\.","errorType":"exception","errorClass":"Exception","httpStatus":null,"severity":"error","filePath":"litellm/proxy/auth/auth_checks.py","lineNumber":484,"sourceCode":"\nasync def _run_project_checks(\n    project_object: LiteLLM_ProjectTableCachedObj | None,\n    _model: str | list[str] | None,\n    llm_router: Router | None,\n    skip_budget_checks: bool,\n    valid_token: UserAPIKeyAuth | None,\n    proxy_logging_obj: ProxyLogging,\n) -> None:\n    \"\"\"\n    Run all project-level checks: blocked, model access, budget, soft budget.\n    Extracted from common_checks() to keep statement count manageable.\n    \"\"\"\n    if project_object is None:\n        return\n\n    # 1.1. If project is blocked\n    if project_object.blocked is True:\n        raise Exception(\n            f\"Project={project_object.project_id} is blocked. Update via `/project/update` if you're an admin.\"\n        )\n\n    # 2.2 If project can call model\n    if _model and len(project_object.models) > 0:\n        can_project_access_model(\n            model=_model,\n            project_object=project_object,\n            llm_router=llm_router,\n        )\n\n    if not skip_budget_checks:\n        # 3.0.2. If project is in budget\n        await _project_max_budget_check(\n            project_object=project_object,\n            valid_token=valid_token,\n            proxy_logging_obj=proxy_logging_obj,\n        )","sourceCodeStart":466,"sourceCodeEnd":502,"githubUrl":"https://github.com/BerriAI/litellm/blob/77b7c6c40c0c5aa5fbcb1d6a1825ac39ca8829b8/litellm/proxy/auth/auth_checks.py#L466-L502","documentation":"Raised in _run_project_checks during the proxy auth pre-call pipeline when the request's key resolves to a LiteLLM project whose row has blocked=True. Blocking a project is an admin action used to freeze spend or disable a workspace; the message points admins at /project/update to reverse it. The exception aborts the request before any model call.","triggerScenarios":"Any authenticated LLM or spend-incurring route called with a virtual key bound to a project_id whose project row was set blocked=true via the admin API/UI.","commonSituations":"An org admin blocks a project for policy or budget reasons while CI jobs or apps still run on its keys; a test project is disabled after a POC and old keys keep hitting it.","solutions":["Ask a proxy admin to unblock: POST /project/update with the project_id","Switch the client to a key bound to a different, unblocked project","If you are the operator, check the key's project via /key/info to confirm which project is blocking"],"exampleFix":"# admin unblocks the project\ncurl -X POST http://localhost:4000/project/update \\\n  -H \"Authorization: Bearer sk-admin\" \\\n  -d '{\"project_id\": \"my-project\", \"blocked\": false}'","handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"try:\n    resp = client.chat.completions.create(model=\"gpt-4o\", messages=messages)\nexcept Exception as e:\n    if \"is blocked\" in str(e) and \"project\" in str(e):\n        raise RuntimeError(\"project disabled by admin - switch keys\") from e\n    raise","preventionTips":["When blocking a project, rotate or disable its keys in the same change","Monitor for auth failures mentioning 'blocked' to catch stale key usage early","Keep an unblocked fallback project/key for critical pipelines"],"tags":["project","blocked","auth","admin-action","litellm-proxy"],"backgroundTag":"resource-access-blocked","analyzedSha":"77b7c6c40c0c5aa5fbcb1d6a1825ac39ca8829b8","analyzedAt":"2026-08-18T11:44:31.656Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}