{
  "opencollection": "1.0.0",
  "info": {
    "name": "papi alert-query-proxy workspaces API",
    "version": "2.0.0"
  },
  "items": [
    {
      "info": {
        "name": "workspaces",
        "type": "folder"
      },
      "items": [
        {
          "info": {
            "name": "List workspaces for the current user",
            "type": "http"
          },
          "http": {
            "method": "GET",
            "url": "{{baseUrl}}/api/v1/workspaces",
            "params": [
              {
                "name": "limit",
                "value": "",
                "type": "query",
                "description": "Maximum number of results"
              },
              {
                "name": "offset",
                "value": "",
                "type": "query",
                "description": "Number of results to skip"
              }
            ],
            "auth": {
              "type": "bearer",
              "token": "{{bearerToken}}"
            }
          },
          "docs": "List all workspaces the current user has access to.\n\nReturns workspaces where the user is either the owner or has\nexplicit permissions.\n\nArgs:\n    limit: Maximum number of results to return.\n    offset: Number of results to skip.\n    session: Database session.\n    current_user: The authenticated user.\n\nReturns:\n    Paginated list of workspaces."
        },
        {
          "info": {
            "name": "Create a new workspace",
            "type": "http"
          },
          "http": {
            "method": "POST",
            "url": "{{baseUrl}}/api/v1/workspaces",
            "body": {
              "type": "json",
              "data": "{}"
            },
            "auth": {
              "type": "bearer",
              "token": "{{bearerToken}}"
            }
          },
          "docs": "Create a new workspace (synchronous, DB-direct).\n\nThis endpoint:\n1. Auto-suffixes the name if it collides with an existing workspace,\n   tombstone, repository, or K8s CRD (e.g. ``myws`` -> ``myws-2``).\n2. Creates the workspace DB record and provisions runner infrastructure.\n3. Returns with status=\"ready\" on success.\n\nCreation is synchronous — no polling required after a 201 response."
        },
        {
          "info": {
            "name": "Get a workspace by name",
            "type": "http"
          },
          "http": {
            "method": "GET",
            "url": "{{baseUrl}}/api/v1/workspaces/:workspace_short_name",
            "params": [
              {
                "name": "workspace_short_name",
                "value": "",
                "type": "path"
              },
              {
                "name": "detail",
                "value": "",
                "type": "query",
                "description": "If true, load SLXs and firing alerts. Default false: fast metadata-only response."
              }
            ],
            "auth": {
              "type": "bearer",
              "token": "{{bearerToken}}"
            }
          },
          "docs": "Get a workspace by its short name.\n\nArgs:\n    workspace_short_name: The workspace short name (e.g., 'pp-04').\n    detail: If true, include additional details (SLXs, alerts, spec). Defaults to false.\n    session: Database session.\n    current_user: The authenticated user.\n\nReturns:\n    The workspace details.\n\nRaises:\n    HTTPException: 404 if workspace not found or user has no access."
        },
        {
          "info": {
            "name": "Get workspace provisioning progress",
            "type": "http"
          },
          "http": {
            "method": "GET",
            "url": "{{baseUrl}}/api/v1/workspaces/provisioning-status/:workspace_name",
            "params": [
              {
                "name": "workspace_name",
                "value": "",
                "type": "path"
              }
            ],
            "auth": {
              "type": "bearer",
              "token": "{{bearerToken}}"
            }
          },
          "docs": "Get workspace provisioning progress without requiring a DB workspace record.\n\nNon-detail endpoint — bypasses workspace permission checks.\nOnly requires authentication. Returns boolean stage flags and sync status.\nUsed by the UI wizard to poll until all provisioning stages complete.\n\nCRD-less mode: workspace creation is synchronous — all stages are\ncomplete if the workspace exists in the database."
        },
        {
          "info": {
            "name": "Update a workspace",
            "type": "http"
          },
          "http": {
            "method": "PATCH",
            "url": "{{baseUrl}}/api/v1/workspaces/:workspace_name",
            "params": [
              {
                "name": "workspace_name",
                "value": "",
                "type": "path"
              }
            ],
            "body": {
              "type": "json",
              "data": "{}"
            },
            "auth": {
              "type": "bearer",
              "token": "{{bearerToken}}"
            }
          },
          "docs": "Update a workspace (partial update).\n\nAccepts workspace name (slug) as the path parameter. All body fields are\noptional; only non-None values are applied.\n\nSupports updating: alias, description, scrubber_config, enabled_locations,\nconfig_provided, permissions (full replacement), slx_groups, slx_relationships.\n\nRequires admin permission on the workspace.\n\nArgs:\n    workspace_name: The workspace short name (slug, e.g. 'my-workspace').\n    data: The workspace update data.\n    session: Database sess"
        },
        {
          "info": {
            "name": "Delete a workspace",
            "type": "http"
          },
          "http": {
            "method": "DELETE",
            "url": "{{baseUrl}}/api/v1/workspaces/:workspace_name",
            "params": [
              {
                "name": "workspace_name",
                "value": "",
                "type": "path"
              }
            ],
            "auth": {
              "type": "bearer",
              "token": "{{bearerToken}}"
            }
          },
          "docs": "Delete a workspace with full multi-system cleanup.\n\nPhase 1 (sync): Vault secrets, Slack, K8s CRDs, git repo, DB + tombstone.\nPhase 2 (async): Sobow, USearch, GCS files, email notification.\n\nReturns step-by-step status for each cleanup operation.\nRequires admin permission on the workspace."
        },
        {
          "info": {
            "name": "Get workspace configuration index",
            "type": "http"
          },
          "http": {
            "method": "GET",
            "url": "{{baseUrl}}/api/v1/workspaces/:workspace_name/workspace-configuration-index",
            "params": [
              {
                "name": "workspace_name",
                "value": "",
                "type": "path"
              }
            ],
            "auth": {
              "type": "bearer",
              "token": "{{bearerToken}}"
            }
          },
          "docs": "Get the workspace configuration index from sobow.\n\nThe configuration index contains cached workspace data including:\n- SLX metadata and task information\n- Entity index (Kubernetes resources, cloud resources, etc.)\n- Workspace relationships and hierarchies\n\nThis endpoint proxies to the sobow service which owns the canonical\nworkspace configuration index cached in Redis.\n\nArgs:\n    workspace_name: The workspace name (not ID).\n    session: Database session.\n    current_user: The authenticated user."
        },
        {
          "info": {
            "name": "Get workspace metadata from sobow",
            "type": "http"
          },
          "http": {
            "method": "GET",
            "url": "{{baseUrl}}/api/v1/workspaces/:workspace_name/metadata",
            "params": [
              {
                "name": "workspace_name",
                "value": "",
                "type": "path"
              }
            ],
            "auth": {
              "type": "bearer",
              "token": "{{bearerToken}}"
            }
          },
          "docs": "Get workspace metadata from sobow service.\n\nReturns metadata about the workspace including index status,\ntask counts, and other operational information.\n\nArgs:\n    workspace_name: The workspace name (not ID).\n    session: Database session.\n    current_user: The authenticated user.\n    sobow: Sobow client for fetching metadata.\n\nReturns:\n    The workspace metadata as a dictionary, or None if not available.\n\nRaises:\n    HTTPException: 404 if workspace not found.\n    HTTPException: 503 if sobow ser"
        },
        {
          "info": {
            "name": "Get workspace entities",
            "type": "http"
          },
          "http": {
            "method": "GET",
            "url": "{{baseUrl}}/api/v1/workspaces/:workspace_name/entities",
            "params": [
              {
                "name": "workspace_name",
                "value": "",
                "type": "path"
              }
            ],
            "auth": {
              "type": "bearer",
              "token": "{{bearerToken}}"
            }
          },
          "docs": "Get entities (Kubernetes resources, cloud resources, etc.) for a workspace.\n\nEntities are extracted from the workspace configuration and represent\nthe discoverable resources that can be referenced in tasks.\n\nArgs:\n    workspace_name: The workspace name (not ID).\n    session: Database session.\n    current_user: The authenticated user.\n    sobow: Sobow client for fetching entities.\n\nReturns:\n    Dictionary containing workspace entities organized by type.\n\nRaises:\n    HTTPException: 404 if workspac"
        },
        {
          "info": {
            "name": "Get workspace index health",
            "type": "http"
          },
          "http": {
            "method": "GET",
            "url": "{{baseUrl}}/api/v1/workspaces/:workspace_name/index-health",
            "params": [
              {
                "name": "workspace_name",
                "value": "",
                "type": "path"
              }
            ],
            "auth": {
              "type": "bearer",
              "token": "{{bearerToken}}"
            }
          },
          "docs": "Get the health status of the workspace task index.\n\nReturns information about the index's current state, including\nlast update time, task counts, and any indexing errors.\n\nArgs:\n    workspace_name: The workspace name (not ID).\n    session: Database session.\n    current_user: The authenticated user.\n    sobow: Sobow client for fetching health status.\n\nReturns:\n    Dictionary containing index health information.\n\nRaises:\n    HTTPException: 404 if workspace not found.\n    HTTPException: 503 if sobo"
        },
        {
          "info": {
            "name": "Get workspace creation status",
            "type": "http"
          },
          "http": {
            "method": "GET",
            "url": "{{baseUrl}}/api/v1/workspaces/:workspace_name/status",
            "params": [
              {
                "name": "workspace_name",
                "value": "",
                "type": "path"
              }
            ],
            "auth": {
              "type": "bearer",
              "token": "{{bearerToken}}"
            }
          },
          "docs": "Get the status of a workspace creation.\n\nThis endpoint is used to poll for workspace creation completion.\nIt checks:\n1. Whether the workspace exists in the database\n2. Whether the WorkSync has successfully reconciled\n\nArgs:\n    workspace_name: The workspace name.\n    session: Database session.\n    current_user: The authenticated user.\n\nReturns:\n    WorkspaceStatusResponse with workspace and sync booleans."
        },
        {
          "info": {
            "name": "Get current user's permissions on workspace",
            "type": "http"
          },
          "http": {
            "method": "GET",
            "url": "{{baseUrl}}/api/v1/workspaces/:workspace_name/my-permissions",
            "params": [
              {
                "name": "workspace_name",
                "value": "",
                "type": "path"
              }
            ],
            "auth": {
              "type": "bearer",
              "token": "{{bearerToken}}"
            }
          },
          "docs": "Get the current user's permissions (roles) on a workspace.\n\nReturns a list of role strings the user has on this workspace.\nThis matches the Django implementation which returns a set of roles."
        },
        {
          "info": {
            "name": "Get workspace sync status from WorkSync CRD",
            "type": "http"
          },
          "http": {
            "method": "GET",
            "url": "{{baseUrl}}/api/v1/workspaces/:workspace_name/sync-status",
            "params": [
              {
                "name": "workspace_name",
                "value": "",
                "type": "path"
              }
            ],
            "auth": {
              "type": "bearer",
              "token": "{{bearerToken}}"
            }
          },
          "docs": "Get the sync status for a workspace from the WorkSync Kubernetes CRD.\n\nReturns information about the workspace's GitOps sync status including\nconditions, last applied revision, and related Kubernetes events.\n\nArgs:\n    workspace_name: The workspace name (not ID).\n    session: Database session.\n    current_user: The authenticated user.\n\nReturns:\n    Dictionary containing WorkSync status and events.\n\nRaises:\n    HTTPException: 404 if workspace not found or no WorkSync CRD exists."
        },
        {
          "info": {
            "name": "List workspace secret keys",
            "type": "http"
          },
          "http": {
            "method": "GET",
            "url": "{{baseUrl}}/api/v1/workspaces/:workspace_name/secrets-keys",
            "params": [
              {
                "name": "workspace_name",
                "value": "",
                "type": "path"
              }
            ],
            "auth": {
              "type": "bearer",
              "token": "{{bearerToken}}"
            }
          },
          "docs": "Get list of secret key names for a workspace.\n\nReturns only the key names, not the secret values.\nRequires read access to the workspace."
        },
        {
          "info": {
            "name": "Create or update workspace secrets",
            "type": "http"
          },
          "http": {
            "method": "POST",
            "url": "{{baseUrl}}/api/v1/workspaces/:workspace_name/secrets",
            "params": [
              {
                "name": "workspace_name",
                "value": "",
                "type": "path"
              }
            ],
            "body": {
              "type": "json",
              "data": "{}"
            },
            "auth": {
              "type": "bearer",
              "token": "{{bearerToken}}"
            }
          },
          "docs": "Create or update workspace secrets in Vault.\n\nRequires admin access to the workspace."
        },
        {
          "info": {
            "name": "Delete a single workspace secret",
            "type": "http"
          },
          "http": {
            "method": "DELETE",
            "url": "{{baseUrl}}/api/v1/workspaces/:workspace_name/secrets/:secret_key",
            "params": [
              {
                "name": "workspace_name",
                "value": "",
                "type": "path"
              },
              {
                "name": "secret_key",
                "value": "",
                "type": "path"
              }
            ],
            "auth": {
              "type": "bearer",
              "token": "{{bearerToken}}"
            }
          },
          "docs": "Permanently delete a single workspace secret by key.\n\nRequires admin access to the workspace. Mirrors Django's\n``WorkspaceViewSet.delete_workspace_secret``."
        },
        {
          "info": {
            "name": "List where a workspace secret is used",
            "type": "http"
          },
          "http": {
            "method": "GET",
            "url": "{{baseUrl}}/api/v1/workspaces/:workspace_name/secrets/:secret_key/usage",
            "params": [
              {
                "name": "workspace_name",
                "value": "",
                "type": "path"
              },
              {
                "name": "secret_key",
                "value": "",
                "type": "path"
              }
            ],
            "auth": {
              "type": "bearer",
              "token": "{{bearerToken}}"
            }
          },
          "docs": "Return the SLIs and Runbooks that reference this workspace secret.\n\nUsed by the UI to warn before deleting a secret that is still in use.\nRequires read access to the workspace. Mirrors Django's\n``WorkspaceViewSet.get_secret_usage``."
        },
        {
          "info": {
            "name": "Reset or create workspace service account",
            "type": "http"
          },
          "http": {
            "method": "POST",
            "url": "{{baseUrl}}/api/v1/workspaces/:workspace_name/reset-service-account",
            "params": [
              {
                "name": "workspace_name",
                "value": "",
                "type": "path"
              }
            ],
            "body": {
              "type": "json",
              "data": "{}"
            },
            "auth": {
              "type": "bearer",
              "token": "{{bearerToken}}"
            }
          },
          "docs": "Reset or create the service account for a workspace.\n\nIf a service account exists for this workspace, updates its password.\nIf no service account exists, creates a new one.\n\nAlso writes the credentials to Vault for use by SLI/Runbook containers.\n\nRequires admin access to the workspace."
        },
        {
          "info": {
            "name": "Get workspace service account token",
            "type": "http"
          },
          "http": {
            "method": "GET",
            "url": "{{baseUrl}}/api/v1/workspaces/:workspace_name/sa-token",
            "params": [
              {
                "name": "workspace_name",
                "value": "",
                "type": "path"
              },
              {
                "name": "token",
                "value": "",
                "type": "query",
                "description": "Token to trade for SA token"
              },
              {
                "name": "tokenType",
                "value": "",
                "type": "query",
                "description": "Type of token being traded"
              }
            ],
            "auth": {
              "type": "bearer",
              "token": "{{bearerToken}}"
            }
          },
          "docs": "Get the workspace service account token.\n\nTrades an existing valid token for a workspace service account token.\nThis is used by runners and SLI containers to authenticate with PAPI.\n\nValid tokenTypes:\n- LOCATION_WORKSPACE_SA_TOKEN: Token from location namespace"
        },
        {
          "info": {
            "name": "Get GitLab service accounts for workspace",
            "type": "http"
          },
          "http": {
            "method": "GET",
            "url": "{{baseUrl}}/api/v1/workspaces/:workspace_name/get-gitlab-sas",
            "params": [
              {
                "name": "workspace_name",
                "value": "",
                "type": "path"
              }
            ],
            "auth": {
              "type": "bearer",
              "token": "{{bearerToken}}"
            }
          },
          "docs": "Get GitLab service accounts for the workspace repository.\n\nReturns service accounts filtered by the user's access level:\n- Admin/readwrite users get both read and write service accounts\n- Read-only users get only read service accounts\n\nReturns empty list for non-GitLab (e.g. Gitea) environments."
        },
        {
          "info": {
            "name": "Search workspace tasks",
            "type": "http"
          },
          "http": {
            "method": "POST",
            "url": "{{baseUrl}}/api/v1/workspaces/:workspace_name/task-search",
            "params": [
              {
                "name": "workspace_name",
                "value": "",
                "type": "path"
              }
            ],
            "body": {
              "type": "json",
              "data": "{}"
            },
            "auth": {
              "type": "bearer",
              "token": "{{bearerToken}}"
            }
          },
          "docs": "Search for tasks in a workspace.\n\nSupports scoping to specific SLXs and persona-based query interpretation."
        },
        {
          "info": {
            "name": "Autocomplete for task search",
            "type": "http"
          },
          "http": {
            "method": "POST",
            "url": "{{baseUrl}}/api/v1/workspaces/:workspace_name/autocomplete",
            "params": [
              {
                "name": "workspace_name",
                "value": "",
                "type": "path"
              }
            ],
            "body": {
              "type": "json",
              "data": "{}"
            },
            "auth": {
              "type": "bearer",
              "token": "{{bearerToken}}"
            }
          },
          "docs": "Get autocomplete suggestions for task search."
        },
        {
          "info": {
            "name": "Get runners",
            "type": "http"
          },
          "http": {
            "method": "GET",
            "url": "{{baseUrl}}/api/v1/workspaces/:workspace_name/runners",
            "params": [
              {
                "name": "workspace_name",
                "value": "",
                "type": "path"
              }
            ],
            "auth": {
              "type": "bearer",
              "token": "{{bearerToken}}"
            }
          },
          "docs": "Returns runners registered for this workspace."
        },
        {
          "info": {
            "name": "[DEPRECATED] Generate workspace builder config",
            "type": "http"
          },
          "http": {
            "method": "GET",
            "url": "{{baseUrl}}/api/v1/workspaces/:workspace_name/generate-workspace-builder-config",
            "params": [
              {
                "name": "workspace_name",
                "value": "",
                "type": "path"
              }
            ],
            "auth": {
              "type": "bearer",
              "token": "{{bearerToken}}"
            }
          },
          "docs": "Deprecated: use GET /{workspace_name}/upload-config instead. Returns 410 Gone."
        },
        {
          "info": {
            "name": "Get search scope options",
            "type": "http"
          },
          "http": {
            "method": "GET",
            "url": "{{baseUrl}}/api/v1/workspaces/:workspace_name/search-scope",
            "params": [
              {
                "name": "workspace_name",
                "value": "",
                "type": "path"
              }
            ],
            "auth": {
              "type": "bearer",
              "token": "{{bearerToken}}"
            }
          },
          "docs": "Return search scope options for the workspace.\n\nReturns SLX groups, subgroups, and individual SLXs with firing alert status.\nUsed by the workspace chat page to build the scope selector."
        },
        {
          "info": {
            "name": "Generate upload config for a location",
            "type": "http"
          },
          "http": {
            "method": "GET",
            "url": "{{baseUrl}}/api/v1/workspaces/:workspace_name/upload-config",
            "params": [
              {
                "name": "workspace_name",
                "value": "",
                "type": "path"
              },
              {
                "name": "location",
                "value": "",
                "type": "query",
                "description": "Location name"
              }
            ],
            "auth": {
              "type": "bearer",
              "token": "{{bearerToken}}"
            }
          },
          "docs": "Returns an SA-scoped uploadConfig for the given workspace and location. Works for both private and public locations — no runner registration required."
        },
        {
          "info": {
            "name": "Generate upload config (internal)",
            "type": "http"
          },
          "http": {
            "method": "GET",
            "url": "{{baseUrl}}/api/v1/workspaces/:workspace_name/internal/upload-config",
            "headers": [
              {
                "name": "RW-Runner-Token",
                "value": ""
              }
            ],
            "params": [
              {
                "name": "workspace_name",
                "value": "",
                "type": "path"
              }
            ],
            "auth": {
              "type": "bearer",
              "token": "{{bearerToken}}"
            }
          },
          "docs": "Generate upload credentials for runner-control.\n\nReturns a short-lived SA token and the public PAPI URL so runner-control\ncan assemble a complete ``uploadInfo`` for workspace-builder.\n\n**Network isolation:** This endpoint MUST be blocked from external access\nvia an ingress deny rule on ``/*/internal/*`` (same pattern as ``/metrics``).\nRunner-control reaches PAPI through the cluster-internal Service URL, which\nbypasses ingress. The ``RW-Runner-Token`` header is required as a secondary\nguard but i"
        },
        {
          "info": {
            "name": "Get runner registration token",
            "type": "http"
          },
          "http": {
            "method": "GET",
            "url": "{{baseUrl}}/api/v1/workspaces/:workspace_name/runner-token",
            "params": [
              {
                "name": "workspace_name",
                "value": "",
                "type": "path"
              },
              {
                "name": "location",
                "value": "",
                "type": "query",
                "description": "Location name for the runner"
              }
            ],
            "auth": {
              "type": "bearer",
              "token": "{{bearerToken}}"
            }
          },
          "docs": "Get a runner registration token for a workspace.\n\nRequires admin permission on the workspace.\nCalls the internal runner service to generate a token.\n\nArgs:\n    workspace_name: The workspace name.\n    location: The location name for the runner.\n    session: Database session.\n    current_user: The authenticated user.\n\nReturns:\n    The runner token response from the runner service.\n\nRaises:\n    HTTPException: 404 if workspace not found.\n    HTTPException: 403 if user lacks admin permission.\n    HTT"
        },
        {
          "info": {
            "name": "Get anonymous mode status",
            "type": "http"
          },
          "http": {
            "method": "GET",
            "url": "{{baseUrl}}/api/v1/workspaces/:workspace_name/anonymous-mode",
            "params": [
              {
                "name": "workspace_name",
                "value": "",
                "type": "path"
              }
            ],
            "auth": {
              "type": "bearer",
              "token": "{{bearerToken}}"
            }
          },
          "docs": "Check whether anonymous mode is enabled for a workspace.\n\nAccess: Staff or workspace admin."
        },
        {
          "info": {
            "name": "Toggle anonymous mode",
            "type": "http"
          },
          "http": {
            "method": "POST",
            "url": "{{baseUrl}}/api/v1/workspaces/:workspace_name/anonymous-mode",
            "params": [
              {
                "name": "workspace_name",
                "value": "",
                "type": "path"
              }
            ],
            "body": {
              "type": "json",
              "data": "{}"
            },
            "auth": {
              "type": "bearer",
              "token": "{{bearerToken}}"
            }
          },
          "docs": "Enable or disable anonymous mode for a workspace.\n\nAccess: Staff or workspace admin."
        },
        {
          "info": {
            "name": "Get workspace statistics",
            "type": "http"
          },
          "http": {
            "method": "GET",
            "url": "{{baseUrl}}/api/v1/workspaces/:workspace_short_name/workspace-stats",
            "params": [
              {
                "name": "workspace_short_name",
                "value": "",
                "type": "path"
              }
            ],
            "auth": {
              "type": "bearer",
              "token": "{{bearerToken}}"
            }
          },
          "docs": "Get pre-aggregated workspace statistics for the chat page subtitle.\n\nReturns alias, assistantCount, tasksCount24h, resourceTypeCounts, issuesCount24h."
        },
        {
          "info": {
            "name": "Get top resources by issue count",
            "type": "http"
          },
          "http": {
            "method": "GET",
            "url": "{{baseUrl}}/api/v1/workspaces/:workspace_short_name/top-issue-resources",
            "params": [
              {
                "name": "workspace_short_name",
                "value": "",
                "type": "path"
              },
              {
                "name": "hours",
                "value": "",
                "type": "query",
                "description": "Lookback window in hours"
              },
              {
                "name": "limit",
                "value": "",
                "type": "query",
                "description": "Max resources to return"
              }
            ],
            "auth": {
              "type": "bearer",
              "token": "{{bearerToken}}"
            }
          },
          "docs": "Get top resources with most issues in a configurable time window.\n\nReturns resources grouped by SLX hierarchy with issue counts,\nfor ticker display on the workspace chat page."
        },
        {
          "info": {
            "name": "Get AgentFarm parameters for a workspace",
            "type": "http"
          },
          "http": {
            "method": "GET",
            "url": "{{baseUrl}}/api/v1/workspaces/:workspace_name/agentfarm-params",
            "params": [
              {
                "name": "workspace_name",
                "value": "",
                "type": "path"
              },
              {
                "name": "llm_category",
                "value": "",
                "type": "query",
                "description": "LLM category: DEFAULT, CHAT, BACKGROUND, EMBEDDING"
              }
            ],
            "auth": {
              "type": "bearer",
              "token": "{{bearerToken}}"
            }
          },
          "docs": "Get parameters for AgentFarm including LLM config, org, user perms, and repo info.\n\nAlso serves to authenticate the user/workspace combination for AgentFarm."
        },
        {
          "info": {
            "name": "Get workspace activity feed",
            "type": "http"
          },
          "http": {
            "method": "GET",
            "url": "{{baseUrl}}/api/v1/workspaces/:workspace_name/activities",
            "params": [
              {
                "name": "workspace_name",
                "value": "",
                "type": "path"
              }
            ],
            "auth": {
              "type": "bearer",
              "token": "{{bearerToken}}"
            }
          },
          "docs": "Proxy workspace activities from the activities service.\n\nDjango parity: WorkspaceViewSet.get_activities proxies to the activities\nservice via activityutils.fetch_workspace_activities()."
        },
        {
          "info": {
            "name": "Delete a runner",
            "type": "http"
          },
          "http": {
            "method": "DELETE",
            "url": "{{baseUrl}}/api/v1/workspaces/:workspace_name/runners/:runner_id",
            "params": [
              {
                "name": "workspace_name",
                "value": "",
                "type": "path"
              },
              {
                "name": "runner_id",
                "value": "",
                "type": "path"
              }
            ],
            "auth": {
              "type": "bearer",
              "token": "{{bearerToken}}"
            }
          },
          "docs": "Delete a runner from the database.\n\nValidates that the runner belongs to the specified workspace,\ndeletes the runner record, and revokes associated upload PATs."
        },
        {
          "info": {
            "name": "Get workspace layout",
            "type": "http"
          },
          "http": {
            "method": "GET",
            "url": "{{baseUrl}}/api/v1/workspaces/:workspace_name/layout",
            "params": [
              {
                "name": "workspace_name",
                "value": "",
                "type": "path"
              },
              {
                "name": "alt_layout",
                "value": "",
                "type": "query",
                "description": "Return alt_layout instead of layout"
              }
            ],
            "auth": {
              "type": "bearer",
              "token": "{{bearerToken}}"
            }
          },
          "docs": "Returns the workspace layout JSON (or alt_layout when ?alt_layout=true)."
        },
        {
          "info": {
            "name": "Save workspace layout",
            "type": "http"
          },
          "http": {
            "method": "POST",
            "url": "{{baseUrl}}/api/v1/workspaces/:workspace_name/layout",
            "params": [
              {
                "name": "workspace_name",
                "value": "",
                "type": "path"
              },
              {
                "name": "alt_layout",
                "value": "",
                "type": "query",
                "description": "Save to alt_layout instead of layout"
              }
            ],
            "auth": {
              "type": "bearer",
              "token": "{{bearerToken}}"
            }
          },
          "docs": "Saves an arbitrary JSON body as the workspace layout (or alt_layout when ?alt_layout=true)."
        },
        {
          "info": {
            "name": "Reprovision workspace runner infrastructure (staff only)",
            "type": "http"
          },
          "http": {
            "method": "POST",
            "url": "{{baseUrl}}/api/v1/workspaces/:workspace_name/reprovision-workspace-infra",
            "params": [
              {
                "name": "workspace_name",
                "value": "",
                "type": "path"
              }
            ],
            "auth": {
              "type": "bearer",
              "token": "{{bearerToken}}"
            }
          },
          "docs": "Re-run workspace-level runner infrastructure provisioning.\n\nCreates or re-creates the Vault AppRole and cert-manager Certificates for\na workspace. Idempotent — safe to call on already-provisioned workspaces.\nReturns per-subsystem status regardless of partial failure (HTTP 200).\n\nAccess: Staff only."
        },
        {
          "info": {
            "name": "Upload workspace archive",
            "type": "http"
          },
          "http": {
            "method": "POST",
            "url": "{{baseUrl}}/api/v1/workspaces/:workspace_short_name/upload",
            "params": [
              {
                "name": "workspace_short_name",
                "value": "",
                "type": "path"
              }
            ],
            "body": {
              "type": "json",
              "data": "{}"
            },
            "auth": {
              "type": "bearer",
              "token": "{{bearerToken}}"
            }
          },
          "docs": "Upload a workspace archive for async processing.\n\nAccepts a base64-encoded tar archive containing workspace configuration.\nThe upload is processed asynchronously via TaskIQ.\n\nArgs:\n    workspace_short_name: The workspace identifier.\n    data: The upload request containing file_content and optional file_hash.\n    current_user: The authenticated user.\n    session: The database session.\n\nReturns:\n    WorkspaceUploadResponse with task_id for status tracking."
        },
        {
          "info": {
            "name": "Check upload task status",
            "type": "http"
          },
          "http": {
            "method": "GET",
            "url": "{{baseUrl}}/api/v1/workspaces/upload-status/:task_id",
            "params": [
              {
                "name": "task_id",
                "value": "",
                "type": "path"
              }
            ],
            "auth": {
              "type": "bearer",
              "token": "{{bearerToken}}"
            }
          },
          "docs": "Check the status of an upload task.\n\nArgs:\n    task_id: The task ID returned from the upload endpoint.\n    current_user: The authenticated user.\n\nReturns:\n    UploadStatusResponse with current task status."
        },
        {
          "info": {
            "name": "Upload workspace archive",
            "type": "http"
          },
          "http": {
            "method": "POST",
            "url": "{{baseUrl}}/api/v3/workspaces/:workspace_short_name/upload",
            "params": [
              {
                "name": "workspace_short_name",
                "value": "",
                "type": "path"
              }
            ],
            "body": {
              "type": "json",
              "data": "{}"
            },
            "auth": {
              "type": "bearer",
              "token": "{{bearerToken}}"
            }
          },
          "docs": "Upload a workspace archive for async processing.\n\nAccepts a base64-encoded tar archive containing workspace configuration.\nThe upload is processed asynchronously via TaskIQ.\n\nArgs:\n    workspace_short_name: The workspace identifier.\n    data: The upload request containing file_content and optional file_hash.\n    current_user: The authenticated user.\n    session: The database session.\n\nReturns:\n    WorkspaceUploadResponse with task_id for status tracking."
        },
        {
          "info": {
            "name": "Check upload task status",
            "type": "http"
          },
          "http": {
            "method": "GET",
            "url": "{{baseUrl}}/api/v3/workspaces/upload-status/:task_id",
            "params": [
              {
                "name": "task_id",
                "value": "",
                "type": "path"
              }
            ],
            "auth": {
              "type": "bearer",
              "token": "{{bearerToken}}"
            }
          },
          "docs": "Check the status of an upload task.\n\nArgs:\n    task_id: The task ID returned from the upload endpoint.\n    current_user: The authenticated user.\n\nReturns:\n    UploadStatusResponse with current task status."
        },
        {
          "info": {
            "name": "List workspaces for the current user",
            "type": "http"
          },
          "http": {
            "method": "GET",
            "url": "{{baseUrl}}/api/v3/workspaces",
            "params": [
              {
                "name": "limit",
                "value": "",
                "type": "query",
                "description": "Maximum number of results"
              },
              {
                "name": "offset",
                "value": "",
                "type": "query",
                "description": "Number of results to skip"
              }
            ],
            "auth": {
              "type": "bearer",
              "token": "{{bearerToken}}"
            }
          },
          "docs": "List all workspaces the current user has access to.\n\nReturns workspaces where the user is either the owner or has\nexplicit permissions.\n\nArgs:\n    limit: Maximum number of results to return.\n    offset: Number of results to skip.\n    session: Database session.\n    current_user: The authenticated user.\n\nReturns:\n    Paginated list of workspaces."
        },
        {
          "info": {
            "name": "Create a new workspace",
            "type": "http"
          },
          "http": {
            "method": "POST",
            "url": "{{baseUrl}}/api/v3/workspaces",
            "body": {
              "type": "json",
              "data": "{}"
            },
            "auth": {
              "type": "bearer",
              "token": "{{bearerToken}}"
            }
          },
          "docs": "Create a new workspace (synchronous, DB-direct).\n\nThis endpoint:\n1. Auto-suffixes the name if it collides with an existing workspace,\n   tombstone, repository, or K8s CRD (e.g. ``myws`` -> ``myws-2``).\n2. Creates the workspace DB record and provisions runner infrastructure.\n3. Returns with status=\"ready\" on success.\n\nCreation is synchronous — no polling required after a 201 response."
        },
        {
          "info": {
            "name": "Get a workspace by name",
            "type": "http"
          },
          "http": {
            "method": "GET",
            "url": "{{baseUrl}}/api/v3/workspaces/:workspace_short_name",
            "params": [
              {
                "name": "workspace_short_name",
                "value": "",
                "type": "path"
              },
              {
                "name": "detail",
                "value": "",
                "type": "query",
                "description": "If true, load SLXs and firing alerts. Default false: fast metadata-only response."
              }
            ],
            "auth": {
              "type": "bearer",
              "token": "{{bearerToken}}"
            }
          },
          "docs": "Get a workspace by its short name.\n\nArgs:\n    workspace_short_name: The workspace short name (e.g., 'pp-04').\n    detail: If true, include additional details (SLXs, alerts, spec). Defaults to false.\n    session: Database session.\n    current_user: The authenticated user.\n\nReturns:\n    The workspace details.\n\nRaises:\n    HTTPException: 404 if workspace not found or user has no access."
        },
        {
          "info": {
            "name": "Get workspace provisioning progress",
            "type": "http"
          },
          "http": {
            "method": "GET",
            "url": "{{baseUrl}}/api/v3/workspaces/provisioning-status/:workspace_name",
            "params": [
              {
                "name": "workspace_name",
                "value": "",
                "type": "path"
              }
            ],
            "auth": {
              "type": "bearer",
              "token": "{{bearerToken}}"
            }
          },
          "docs": "Get workspace provisioning progress without requiring a DB workspace record.\n\nNon-detail endpoint — bypasses workspace permission checks.\nOnly requires authentication. Returns boolean stage flags and sync status.\nUsed by the UI wizard to poll until all provisioning stages complete.\n\nCRD-less mode: workspace creation is synchronous — all stages are\ncomplete if the workspace exists in the database."
        },
        {
          "info": {
            "name": "Update a workspace",
            "type": "http"
          },
          "http": {
            "method": "PATCH",
            "url": "{{baseUrl}}/api/v3/workspaces/:workspace_name",
            "params": [
              {
                "name": "workspace_name",
                "value": "",
                "type": "path"
              }
            ],
            "body": {
              "type": "json",
              "data": "{}"
            },
            "auth": {
              "type": "bearer",
              "token": "{{bearerToken}}"
            }
          },
          "docs": "Update a workspace (partial update).\n\nAccepts workspace name (slug) as the path parameter. All body fields are\noptional; only non-None values are applied.\n\nSupports updating: alias, description, scrubber_config, enabled_locations,\nconfig_provided, permissions (full replacement), slx_groups, slx_relationships.\n\nRequires admin permission on the workspace.\n\nArgs:\n    workspace_name: The workspace short name (slug, e.g. 'my-workspace').\n    data: The workspace update data.\n    session: Database sess"
        },
        {
          "info": {
            "name": "Delete a workspace",
            "type": "http"
          },
          "http": {
            "method": "DELETE",
            "url": "{{baseUrl}}/api/v3/workspaces/:workspace_name",
            "params": [
              {
                "name": "workspace_name",
                "value": "",
                "type": "path"
              }
            ],
            "auth": {
              "type": "bearer",
              "token": "{{bearerToken}}"
            }
          },
          "docs": "Delete a workspace with full multi-system cleanup.\n\nPhase 1 (sync): Vault secrets, Slack, K8s CRDs, git repo, DB + tombstone.\nPhase 2 (async): Sobow, USearch, GCS files, email notification.\n\nReturns step-by-step status for each cleanup operation.\nRequires admin permission on the workspace."
        },
        {
          "info": {
            "name": "Get workspace configuration index",
            "type": "http"
          },
          "http": {
            "method": "GET",
            "url": "{{baseUrl}}/api/v3/workspaces/:workspace_name/workspace-configuration-index",
            "params": [
              {
                "name": "workspace_name",
                "value": "",
                "type": "path"
              }
            ],
            "auth": {
              "type": "bearer",
              "token": "{{bearerToken}}"
            }
          },
          "docs": "Get the workspace configuration index from sobow.\n\nThe configuration index contains cached workspace data including:\n- SLX metadata and task information\n- Entity index (Kubernetes resources, cloud resources, etc.)\n- Workspace relationships and hierarchies\n\nThis endpoint proxies to the sobow service which owns the canonical\nworkspace configuration index cached in Redis.\n\nArgs:\n    workspace_name: The workspace name (not ID).\n    session: Database session.\n    current_user: The authenticated user."
        },
        {
          "info": {
            "name": "Get workspace metadata from sobow",
            "type": "http"
          },
          "http": {
            "method": "GET",
            "url": "{{baseUrl}}/api/v3/workspaces/:workspace_name/metadata",
            "params": [
              {
                "name": "workspace_name",
                "value": "",
                "type": "path"
              }
            ],
            "auth": {
              "type": "bearer",
              "token": "{{bearerToken}}"
            }
          },
          "docs": "Get workspace metadata from sobow service.\n\nReturns metadata about the workspace including index status,\ntask counts, and other operational information.\n\nArgs:\n    workspace_name: The workspace name (not ID).\n    session: Database session.\n    current_user: The authenticated user.\n    sobow: Sobow client for fetching metadata.\n\nReturns:\n    The workspace metadata as a dictionary, or None if not available.\n\nRaises:\n    HTTPException: 404 if workspace not found.\n    HTTPException: 503 if sobow ser"
        },
        {
          "info": {
            "name": "Get workspace entities",
            "type": "http"
          },
          "http": {
            "method": "GET",
            "url": "{{baseUrl}}/api/v3/workspaces/:workspace_name/entities",
            "params": [
              {
                "name": "workspace_name",
                "value": "",
                "type": "path"
              }
            ],
            "auth": {
              "type": "bearer",
              "token": "{{bearerToken}}"
            }
          },
          "docs": "Get entities (Kubernetes resources, cloud resources, etc.) for a workspace.\n\nEntities are extracted from the workspace configuration and represent\nthe discoverable resources that can be referenced in tasks.\n\nArgs:\n    workspace_name: The workspace name (not ID).\n    session: Database session.\n    current_user: The authenticated user.\n    sobow: Sobow client for fetching entities.\n\nReturns:\n    Dictionary containing workspace entities organized by type.\n\nRaises:\n    HTTPException: 404 if workspac"
        },
        {
          "info": {
            "name": "Get workspace index health",
            "type": "http"
          },
          "http": {
            "method": "GET",
            "url": "{{baseUrl}}/api/v3/workspaces/:workspace_name/index-health",
            "params": [
              {
                "name": "workspace_name",
                "value": "",
                "type": "path"
              }
            ],
            "auth": {
              "type": "bearer",
              "token": "{{bearerToken}}"
            }
          },
          "docs": "Get the health status of the workspace task index.\n\nReturns information about the index's current state, including\nlast update time, task counts, and any indexing errors.\n\nArgs:\n    workspace_name: The workspace name (not ID).\n    session: Database session.\n    current_user: The authenticated user.\n    sobow: Sobow client for fetching health status.\n\nReturns:\n    Dictionary containing index health information.\n\nRaises:\n    HTTPException: 404 if workspace not found.\n    HTTPException: 503 if sobo"
        },
        {
          "info": {
            "name": "Get workspace creation status",
            "type": "http"
          },
          "http": {
            "method": "GET",
            "url": "{{baseUrl}}/api/v3/workspaces/:workspace_name/status",
            "params": [
              {
                "name": "workspace_name",
                "value": "",
                "type": "path"
              }
            ],
            "auth": {
              "type": "bearer",
              "token": "{{bearerToken}}"
            }
          },
          "docs": "Get the status of a workspace creation.\n\nThis endpoint is used to poll for workspace creation completion.\nIt checks:\n1. Whether the workspace exists in the database\n2. Whether the WorkSync has successfully reconciled\n\nArgs:\n    workspace_name: The workspace name.\n    session: Database session.\n    current_user: The authenticated user.\n\nReturns:\n    WorkspaceStatusResponse with workspace and sync booleans."
        },
        {
          "info": {
            "name": "Get current user's permissions on workspace",
            "type": "http"
          },
          "http": {
            "method": "GET",
            "url": "{{baseUrl}}/api/v3/workspaces/:workspace_name/my-permissions",
            "params": [
              {
                "name": "workspace_name",
                "value": "",
                "type": "path"
              }
            ],
            "auth": {
              "type": "bearer",
              "token": "{{bearerToken}}"
            }
          },
          "docs": "Get the current user's permissions (roles) on a workspace.\n\nReturns a list of role strings the user has on this workspace.\nThis matches the Django implementation which returns a set of roles."
        },
        {
          "info": {
            "name": "Get workspace sync status from WorkSync CRD",
            "type": "http"
          },
          "http": {
            "method": "GET",
            "url": "{{baseUrl}}/api/v3/workspaces/:workspace_name/sync-status",
            "params": [
              {
                "name": "workspace_name",
                "value": "",
                "type": "path"
              }
            ],
            "auth": {
              "type": "bearer",
              "token": "{{bearerToken}}"
            }
          },
          "docs": "Get the sync status for a workspace from the WorkSync Kubernetes CRD.\n\nReturns information about the workspace's GitOps sync status including\nconditions, last applied revision, and related Kubernetes events.\n\nArgs:\n    workspace_name: The workspace name (not ID).\n    session: Database session.\n    current_user: The authenticated user.\n\nReturns:\n    Dictionary containing WorkSync status and events.\n\nRaises:\n    HTTPException: 404 if workspace not found or no WorkSync CRD exists."
        },
        {
          "info": {
            "name": "List workspace secret keys",
            "type": "http"
          },
          "http": {
            "method": "GET",
            "url": "{{baseUrl}}/api/v3/workspaces/:workspace_name/secrets-keys",
            "params": [
              {
                "name": "workspace_name",
                "value": "",
                "type": "path"
              }
            ],
            "auth": {
              "type": "bearer",
              "token": "{{bearerToken}}"
            }
          },
          "docs": "Get list of secret key names for a workspace.\n\nReturns only the key names, not the secret values.\nRequires read access to the workspace."
        },
        {
          "info": {
            "name": "Create or update workspace secrets",
            "type": "http"
          },
          "http": {
            "method": "POST",
            "url": "{{baseUrl}}/api/v3/workspaces/:workspace_name/secrets",
            "params": [
              {
                "name": "workspace_name",
                "value": "",
                "type": "path"
              }
            ],
            "body": {
              "type": "json",
              "data": "{}"
            },
            "auth": {
              "type": "bearer",
              "token": "{{bearerToken}}"
            }
          },
          "docs": "Create or update workspace secrets in Vault.\n\nRequires admin access to the workspace."
        },
        {
          "info": {
            "name": "Delete a single workspace secret",
            "type": "http"
          },
          "http": {
            "method": "DELETE",
            "url": "{{baseUrl}}/api/v3/workspaces/:workspace_name/secrets/:secret_key",
            "params": [
              {
                "name": "workspace_name",
                "value": "",
                "type": "path"
              },
              {
                "name": "secret_key",
                "value": "",
                "type": "path"
              }
            ],
            "auth": {
              "type": "bearer",
              "token": "{{bearerToken}}"
            }
          },
          "docs": "Permanently delete a single workspace secret by key.\n\nRequires admin access to the workspace. Mirrors Django's\n``WorkspaceViewSet.delete_workspace_secret``."
        },
        {
          "info": {
            "name": "List where a workspace secret is used",
            "type": "http"
          },
          "http": {
            "method": "GET",
            "url": "{{baseUrl}}/api/v3/workspaces/:workspace_name/secrets/:secret_key/usage",
            "params": [
              {
                "name": "workspace_name",
                "value": "",
                "type": "path"
              },
              {
                "name": "secret_key",
                "value": "",
                "type": "path"
              }
            ],
            "auth": {
              "type": "bearer",
              "token": "{{bearerToken}}"
            }
          },
          "docs": "Return the SLIs and Runbooks that reference this workspace secret.\n\nUsed by the UI to warn before deleting a secret that is still in use.\nRequires read access to the workspace. Mirrors Django's\n``WorkspaceViewSet.get_secret_usage``."
        },
        {
          "info": {
            "name": "Reset or create workspace service account",
            "type": "http"
          },
          "http": {
            "method": "POST",
            "url": "{{baseUrl}}/api/v3/workspaces/:workspace_name/reset-service-account",
            "params": [
              {
                "name": "workspace_name",
                "value": "",
                "type": "path"
              }
            ],
            "body": {
              "type": "json",
              "data": "{}"
            },
            "auth": {
              "type": "bearer",
              "token": "{{bearerToken}}"
            }
          },
          "docs": "Reset or create the service account for a workspace.\n\nIf a service account exists for this workspace, updates its password.\nIf no service account exists, creates a new one.\n\nAlso writes the credentials to Vault for use by SLI/Runbook containers.\n\nRequires admin access to the workspace."
        },
        {
          "info": {
            "name": "Get workspace service account token",
            "type": "http"
          },
          "http": {
            "method": "GET",
            "url": "{{baseUrl}}/api/v3/workspaces/:workspace_name/sa-token",
            "params": [
              {
                "name": "workspace_name",
                "value": "",
                "type": "path"
              },
              {
                "name": "token",
                "value": "",
                "type": "query",
                "description": "Token to trade for SA token"
              },
              {
                "name": "tokenType",
                "value": "",
                "type": "query",
                "description": "Type of token being traded"
              }
            ],
            "auth": {
              "type": "bearer",
              "token": "{{bearerToken}}"
            }
          },
          "docs": "Get the workspace service account token.\n\nTrades an existing valid token for a workspace service account token.\nThis is used by runners and SLI containers to authenticate with PAPI.\n\nValid tokenTypes:\n- LOCATION_WORKSPACE_SA_TOKEN: Token from location namespace"
        },
        {
          "info": {
            "name": "Get GitLab service accounts for workspace",
            "type": "http"
          },
          "http": {
            "method": "GET",
            "url": "{{baseUrl}}/api/v3/workspaces/:workspace_name/get-gitlab-sas",
            "params": [
              {
                "name": "workspace_name",
                "value": "",
                "type": "path"
              }
            ],
            "auth": {
              "type": "bearer",
              "token": "{{bearerToken}}"
            }
          },
          "docs": "Get GitLab service accounts for the workspace repository.\n\nReturns service accounts filtered by the user's access level:\n- Admin/readwrite users get both read and write service accounts\n- Read-only users get only read service accounts\n\nReturns empty list for non-GitLab (e.g. Gitea) environments."
        },
        {
          "info": {
            "name": "Search workspace tasks",
            "type": "http"
          },
          "http": {
            "method": "POST",
            "url": "{{baseUrl}}/api/v3/workspaces/:workspace_name/task-search",
            "params": [
              {
                "name": "workspace_name",
                "value": "",
                "type": "path"
              }
            ],
            "body": {
              "type": "json",
              "data": "{}"
            },
            "auth": {
              "type": "bearer",
              "token": "{{bearerToken}}"
            }
          },
          "docs": "Search for tasks in a workspace.\n\nSupports scoping to specific SLXs and persona-based query interpretation."
        },
        {
          "info": {
            "name": "Autocomplete for task search",
            "type": "http"
          },
          "http": {
            "method": "POST",
            "url": "{{baseUrl}}/api/v3/workspaces/:workspace_name/autocomplete",
            "params": [
              {
                "name": "workspace_name",
                "value": "",
                "type": "path"
              }
            ],
            "body": {
              "type": "json",
              "data": "{}"
            },
            "auth": {
              "type": "bearer",
              "token": "{{bearerToken}}"
            }
          },
          "docs": "Get autocomplete suggestions for task search."
        },
        {
          "info": {
            "name": "Get runners",
            "type": "http"
          },
          "http": {
            "method": "GET",
            "url": "{{baseUrl}}/api/v3/workspaces/:workspace_name/runners",
            "params": [
              {
                "name": "workspace_name",
                "value": "",
                "type": "path"
              }
            ],
            "auth": {
              "type": "bearer",
              "token": "{{bearerToken}}"
            }
          },
          "docs": "Returns runners registered for this workspace."
        },
        {
          "info": {
            "name": "[DEPRECATED] Generate workspace builder config",
            "type": "http"
          },
          "http": {
            "method": "GET",
            "url": "{{baseUrl}}/api/v3/workspaces/:workspace_name/generate-workspace-builder-config",
            "params": [
              {
                "name": "workspace_name",
                "value": "",
                "type": "path"
              }
            ],
            "auth": {
              "type": "bearer",
              "token": "{{bearerToken}}"
            }
          },
          "docs": "Deprecated: use GET /{workspace_name}/upload-config instead. Returns 410 Gone."
        },
        {
          "info": {
            "name": "Get search scope options",
            "type": "http"
          },
          "http": {
            "method": "GET",
            "url": "{{baseUrl}}/api/v3/workspaces/:workspace_name/search-scope",
            "params": [
              {
                "name": "workspace_name",
                "value": "",
                "type": "path"
              }
            ],
            "auth": {
              "type": "bearer",
              "token": "{{bearerToken}}"
            }
          },
          "docs": "Return search scope options for the workspace.\n\nReturns SLX groups, subgroups, and individual SLXs with firing alert status.\nUsed by the workspace chat page to build the scope selector."
        },
        {
          "info": {
            "name": "Generate upload config for a location",
            "type": "http"
          },
          "http": {
            "method": "GET",
            "url": "{{baseUrl}}/api/v3/workspaces/:workspace_name/upload-config",
            "params": [
              {
                "name": "workspace_name",
                "value": "",
                "type": "path"
              },
              {
                "name": "location",
                "value": "",
                "type": "query",
                "description": "Location name"
              }
            ],
            "auth": {
              "type": "bearer",
              "token": "{{bearerToken}}"
            }
          },
          "docs": "Returns an SA-scoped uploadConfig for the given workspace and location. Works for both private and public locations — no runner registration required."
        },
        {
          "info": {
            "name": "Generate upload config (internal)",
            "type": "http"
          },
          "http": {
            "method": "GET",
            "url": "{{baseUrl}}/api/v3/workspaces/:workspace_name/internal/upload-config",
            "headers": [
              {
                "name": "RW-Runner-Token",
                "value": ""
              }
            ],
            "params": [
              {
                "name": "workspace_name",
                "value": "",
                "type": "path"
              }
            ],
            "auth": {
              "type": "bearer",
              "token": "{{bearerToken}}"
            }
          },
          "docs": "Generate upload credentials for runner-control.\n\nReturns a short-lived SA token and the public PAPI URL so runner-control\ncan assemble a complete ``uploadInfo`` for workspace-builder.\n\n**Network isolation:** This endpoint MUST be blocked from external access\nvia an ingress deny rule on ``/*/internal/*`` (same pattern as ``/metrics``).\nRunner-control reaches PAPI through the cluster-internal Service URL, which\nbypasses ingress. The ``RW-Runner-Token`` header is required as a secondary\nguard but i"
        },
        {
          "info": {
            "name": "Get runner registration token",
            "type": "http"
          },
          "http": {
            "method": "GET",
            "url": "{{baseUrl}}/api/v3/workspaces/:workspace_name/runner-token",
            "params": [
              {
                "name": "workspace_name",
                "value": "",
                "type": "path"
              },
              {
                "name": "location",
                "value": "",
                "type": "query",
                "description": "Location name for the runner"
              }
            ],
            "auth": {
              "type": "bearer",
              "token": "{{bearerToken}}"
            }
          },
          "docs": "Get a runner registration token for a workspace.\n\nRequires admin permission on the workspace.\nCalls the internal runner service to generate a token.\n\nArgs:\n    workspace_name: The workspace name.\n    location: The location name for the runner.\n    session: Database session.\n    current_user: The authenticated user.\n\nReturns:\n    The runner token response from the runner service.\n\nRaises:\n    HTTPException: 404 if workspace not found.\n    HTTPException: 403 if user lacks admin permission.\n    HTT"
        },
        {
          "info": {
            "name": "Get anonymous mode status",
            "type": "http"
          },
          "http": {
            "method": "GET",
            "url": "{{baseUrl}}/api/v3/workspaces/:workspace_name/anonymous-mode",
            "params": [
              {
                "name": "workspace_name",
                "value": "",
                "type": "path"
              }
            ],
            "auth": {
              "type": "bearer",
              "token": "{{bearerToken}}"
            }
          },
          "docs": "Check whether anonymous mode is enabled for a workspace.\n\nAccess: Staff or workspace admin."
        },
        {
          "info": {
            "name": "Toggle anonymous mode",
            "type": "http"
          },
          "http": {
            "method": "POST",
            "url": "{{baseUrl}}/api/v3/workspaces/:workspace_name/anonymous-mode",
            "params": [
              {
                "name": "workspace_name",
                "value": "",
                "type": "path"
              }
            ],
            "body": {
              "type": "json",
              "data": "{}"
            },
            "auth": {
              "type": "bearer",
              "token": "{{bearerToken}}"
            }
          },
          "docs": "Enable or disable anonymous mode for a workspace.\n\nAccess: Staff or workspace admin."
        },
        {
          "info": {
            "name": "Get workspace statistics",
            "type": "http"
          },
          "http": {
            "method": "GET",
            "url": "{{baseUrl}}/api/v3/workspaces/:workspace_short_name/workspace-stats",
            "params": [
              {
                "name": "workspace_short_name",
                "value": "",
                "type": "path"
              }
            ],
            "auth": {
              "type": "bearer",
              "token": "{{bearerToken}}"
            }
          },
          "docs": "Get pre-aggregated workspace statistics for the chat page subtitle.\n\nReturns alias, assistantCount, tasksCount24h, resourceTypeCounts, issuesCount24h."
        },
        {
          "info": {
            "name": "Get top resources by issue count",
            "type": "http"
          },
          "http": {
            "method": "GET",
            "url": "{{baseUrl}}/api/v3/workspaces/:workspace_short_name/top-issue-resources",
            "params": [
              {
                "name": "workspace_short_name",
                "value": "",
                "type": "path"
              },
              {
                "name": "hours",
                "value": "",
                "type": "query",
                "description": "Lookback window in hours"
              },
              {
                "name": "limit",
                "value": "",
                "type": "query",
                "description": "Max resources to return"
              }
            ],
            "auth": {
              "type": "bearer",
              "token": "{{bearerToken}}"
            }
          },
          "docs": "Get top resources with most issues in a configurable time window.\n\nReturns resources grouped by SLX hierarchy with issue counts,\nfor ticker display on the workspace chat page."
        },
        {
          "info": {
            "name": "Get AgentFarm parameters for a workspace",
            "type": "http"
          },
          "http": {
            "method": "GET",
            "url": "{{baseUrl}}/api/v3/workspaces/:workspace_name/agentfarm-params",
            "params": [
              {
                "name": "workspace_name",
                "value": "",
                "type": "path"
              },
              {
                "name": "llm_category",
                "value": "",
                "type": "query",
                "description": "LLM category: DEFAULT, CHAT, BACKGROUND, EMBEDDING"
              }
            ],
            "auth": {
              "type": "bearer",
              "token": "{{bearerToken}}"
            }
          },
          "docs": "Get parameters for AgentFarm including LLM config, org, user perms, and repo info.\n\nAlso serves to authenticate the user/workspace combination for AgentFarm."
        },
        {
          "info": {
            "name": "Get workspace activity feed",
            "type": "http"
          },
          "http": {
            "method": "GET",
            "url": "{{baseUrl}}/api/v3/workspaces/:workspace_name/activities",
            "params": [
              {
                "name": "workspace_name",
                "value": "",
                "type": "path"
              }
            ],
            "auth": {
              "type": "bearer",
              "token": "{{bearerToken}}"
            }
          },
          "docs": "Proxy workspace activities from the activities service.\n\nDjango parity: WorkspaceViewSet.get_activities proxies to the activities\nservice via activityutils.fetch_workspace_activities()."
        },
        {
          "info": {
            "name": "Delete a runner",
            "type": "http"
          },
          "http": {
            "method": "DELETE",
            "url": "{{baseUrl}}/api/v3/workspaces/:workspace_name/runners/:runner_id",
            "params": [
              {
                "name": "workspace_name",
                "value": "",
                "type": "path"
              },
              {
                "name": "runner_id",
                "value": "",
                "type": "path"
              }
            ],
            "auth": {
              "type": "bearer",
              "token": "{{bearerToken}}"
            }
          },
          "docs": "Delete a runner from the database.\n\nValidates that the runner belongs to the specified workspace,\ndeletes the runner record, and revokes associated upload PATs."
        },
        {
          "info": {
            "name": "Get workspace layout",
            "type": "http"
          },
          "http": {
            "method": "GET",
            "url": "{{baseUrl}}/api/v3/workspaces/:workspace_name/layout",
            "params": [
              {
                "name": "workspace_name",
                "value": "",
                "type": "path"
              },
              {
                "name": "alt_layout",
                "value": "",
                "type": "query",
                "description": "Return alt_layout instead of layout"
              }
            ],
            "auth": {
              "type": "bearer",
              "token": "{{bearerToken}}"
            }
          },
          "docs": "Returns the workspace layout JSON (or alt_layout when ?alt_layout=true)."
        },
        {
          "info": {
            "name": "Save workspace layout",
            "type": "http"
          },
          "http": {
            "method": "POST",
            "url": "{{baseUrl}}/api/v3/workspaces/:workspace_name/layout",
            "params": [
              {
                "name": "workspace_name",
                "value": "",
                "type": "path"
              },
              {
                "name": "alt_layout",
                "value": "",
                "type": "query",
                "description": "Save to alt_layout instead of layout"
              }
            ],
            "auth": {
              "type": "bearer",
              "token": "{{bearerToken}}"
            }
          },
          "docs": "Saves an arbitrary JSON body as the workspace layout (or alt_layout when ?alt_layout=true)."
        },
        {
          "info": {
            "name": "Reprovision workspace runner infrastructure (staff only)",
            "type": "http"
          },
          "http": {
            "method": "POST",
            "url": "{{baseUrl}}/api/v3/workspaces/:workspace_name/reprovision-workspace-infra",
            "params": [
              {
                "name": "workspace_name",
                "value": "",
                "type": "path"
              }
            ],
            "auth": {
              "type": "bearer",
              "token": "{{bearerToken}}"
            }
          },
          "docs": "Re-run workspace-level runner infrastructure provisioning.\n\nCreates or re-creates the Vault AppRole and cert-manager Certificates for\na workspace. Idempotent — safe to call on already-provisioned workspaces.\nReturns per-subsystem status regardless of partial failure (HTTP 200).\n\nAccess: Staff only."
        }
      ]
    }
  ],
  "bundled": true
}