---
title: "Turn a default-on catalog skill off for this workspace, or back on"
method: PUT
path: "/v1/skill-catalog/{slug}/workspace-default"
tags: ["skill-hub"]
---

# Turn a default-on catalog skill off for this workspace, or back on

`PUT /v1/skill-catalog/{slug}/workspace-default`

## Request

- Base URL: `https://api.patricia.app` (the document declares no server; this is the origin it was published from)
- URL: `https://api.patricia.app/v1/skill-catalog/{slug}/workspace-default`
- Auth: HTTP bearer

A trusted, listed, portable catalog skill runs for every workspace with NO install row at all. This is how a workspace stops one, and how it gives it back.

`enabled: false` writes the suppressing row (creating the install if there is none) and stamps the pause in ONE transaction. That is why this is a route rather than two client calls: an install row alone does not suppress anything (a never-activated row reads as an unfinished install, deliberately), so a client that installed and then failed the second call would leave the skill running behind a switch drawn as off. The activation route cannot do the second half anyway — a portable skill compiles no activate action.

`enabled: true` DELETES the suppressing row, returning the skill to the exact state a workspace that never touched it is in: running on the catalog's active version. It refuses (409 `SKILL_IS_KILLED`) when a KILLED team row holds the slot: the emergency stop on the skill's own page is what clears that, not this switch. A personal or staff copy answers `changed: false` whatever its state.

Both directions are idempotent apart from that refusal. Both require skills:install, because this changes what the whole team runs.

## Path parameters

- `slug` string, required: The catalog slug, e.g. `competitor-scan`.

## Headers

- `X-Tenant-Id` string, nullable

## Request body

- WorkspaceDefaultRequest: Whether this workspace should run a default-on catalog skill.
  - `enabled` boolean, required: True gives the skill back to the workspace (deleting any suppressing row); false stops it. Both are idempotent.

## Response `200`

Successful Response

- WorkspaceDefaultState: What the workspace's default now is for one skill.
  - `slug` string, required
  - `enabled` boolean, required
  - `changed` boolean, required

## Other responses

- `400`: Bad request
- `401`: Unauthorized
- `403`: Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)
- `404`: Not found
- `409`: Conflict
- `422`: Validation error

---

[API](https://skmtc.dev/patricia/apis/patricia-api.md) · [All operations](https://skmtc.dev/patricia/apis/patricia-api/llms.txt) · [OpenAPI document](https://skmtc.dev/patricia/apis/patricia-api/revisions/0dfb44495ea1?raw)
