---
title: "Toggle Template copying and public listing"
method: PUT
path: "/app/{id}/remixable"
---

# Toggle Template copying and public listing

`PUT /app/{id}/remixable`

## Request

- Base URL: `https://charm.ing`
- URL: `https://charm.ing/app/{id}/remixable`
- Auth: HTTP bearer

Owner-only legacy state surface. When `remixable: true`, people who already hold `app:read` on the source App can create an independent copy. `listed: true` also grants public discovery and copying without granting access to the live source App or its data. Listed always implies Template. When `remixable: false`, copying stops for new users, existing copies are unaffected, and Listed is cleared. `listed` is a patch: `true` publishes, `false` unpublishes, and omitting it preserves the current Listed state. This route cannot edit listing metadata; use `/api/v1/apps/{appId}/template-listing` for the title, summary, Markdown detail, category, cover, and gallery. Idempotent calls are no-ops.

## Request body

- object
  - `remixable` boolean, required
  - `listed` boolean: Whether to also list the app in the public template directory. `true` lists it, `false` unlists it. Omit to leave the current listed state untouched. Only applies when `remixable: true`.

## Response `200`

Remixable state updated.

- AppRemixableResponse: New remixable/listed state plus the shareable URL when remixable is true.
  - `remixable` boolean, required
  - `public_url` string, nullable, required: Shareable URL when `remixable: true` (friendly `/{handle}/{app-name}` form when available, `/app/{id}` otherwise); `null` when `remixable: false`.
  - `listed` boolean, required: Whether the app is listed in the public template directory, reflecting the actual resulting state — not necessarily the request's `listed` field, since an omitted `listed` leaves the prior state unchanged. A listed app is always also `remixable: true`; always `false` when `remixable: false`.

## Other responses

- `400`: Body is not `{ remixable: boolean, listed?: boolean }`.
- `401`: User-scoped auth required.
- `403`: Caller does not own this app.
- `404`: App not found.
- `409`: Race: the row was concurrently re-attributed (e.g. `userId` cleared) between the ownership pre-check and the service-layer mutation. Defense-in-depth — extremely unlikely in practice.

---

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