---
title: "Update a Template listing draft"
method: PATCH
path: "/api/v1/apps/{appId}/template-listing"
tags: ["Apps"]
---

# Update a Template listing draft

`PATCH /api/v1/apps/{appId}/template-listing`

## Request

- Base URL: `https://charm.ing`
- URL: `https://charm.ing/api/v1/apps/{appId}/template-listing`
- Auth: HTTP bearer

User-gated (`chrm_user_*` or session); requires `app:template-edit`. Changes only supplied listing content fields and does not enable, disable, publish, or unpublish the Template.

## Path parameters

- `appId` string, uuid, required

## Request body

- object
  - `title` string, nullable
  - `summary` string, nullable
  - `contentMarkdown` string, nullable
  - `category` 'business' | 'developer-tools' | 'education' | 'entertainment' | 'lifestyle' | 'productivity' | 'utilities' | 'null', nullable
  - `cover` object, nullable
    - `assetKey` string, required
    - `alt` string, required
    - `caption` string, nullable
  - `gallery` object[], nullable
    - `assetKey` string, required
    - `alt` string, required
    - `caption` string, nullable

## Response `200`

Updated editable Template listing.

- TemplateListingResponse
  - `ok` true, required
  - `listing` TemplateListing, required
    - `appId` string, uuid, required
    - `creator` object, required
      - `handle` string, required
    - `builders` integer, required
    - `draft` object, required
      - `title` string, nullable, required
      - `summary` string, nullable, required
      - `contentMarkdown` string, nullable, required
      - `category` 'business' | 'developer-tools' | 'education' | 'entertainment' | 'lifestyle' | 'productivity' | 'utilities' | 'null', nullable, required
      - `cover` TemplateListingMedia, required
        - `id` string, uuid, required
        - `kind` 'cover' | 'screenshot', required
        - `assetKey` string, required
        - `url` string, uri, required
        - `alt` string, required
        - `caption` string, nullable, required
        - `position` integer, required
      - `gallery` TemplateListingMedia[], required
        - `id` string, uuid, required
        - `kind` 'cover' | 'screenshot', required
        - `assetKey` string, required
        - `url` string, uri, required
        - `alt` string, required
        - `caption` string, nullable, required
        - `position` integer, required
      - `legacyFallback` boolean, required
    - `resolved` TemplateListingFields, required
      - `title` string, nullable, required
      - `summary` string, nullable, required
      - `contentMarkdown` string, nullable, required
      - `category` 'business' | 'developer-tools' | 'education' | 'entertainment' | 'lifestyle' | 'productivity' | 'utilities' | 'null', nullable, required
      - `cover` TemplateListingMedia, required
        - `id` string, uuid, required
        - `kind` 'cover' | 'screenshot', required
        - `assetKey` string, required
        - `url` string, uri, required
        - `alt` string, required
        - `caption` string, nullable, required
        - `position` integer, required
      - `gallery` TemplateListingMedia[], required
        - `id` string, uuid, required
        - `kind` 'cover' | 'screenshot', required
        - `assetKey` string, required
        - `url` string, uri, required
        - `alt` string, required
        - `caption` string, nullable, required
        - `position` integer, required
    - `templateEnabled` boolean, required
    - `listed` boolean, required
    - `validation` object, required
      - `complete` boolean, required
      - `missingFields` string[], required
    - `publicUrl` string, nullable, required

## Other responses

- `400`: Invalid app id or request body.
- `401`: Sign-in required.
- `403`: The caller cannot edit this Template.
- `404`: App not found.
- `422`: Listing content or media is invalid.

---

[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)
