**Version: 202601**

# Save page-builder custom template

**POST** `/openapi/2026-01/themes/page-builder/custom-templates`

Save a custom card template based on an existing template; `action` decides how it is saved. All three actions produce a new template id, and `update` takes the original template down.

## Request

**application/json**

**Body | Example**

**Body (required)**

- `action` string (required)

  Action. All three create a new template; they differ in whether it is listed:

  *   `save_as`: A new copy, listed
  *   `update`: A new listed version; the template given by `template_id` is taken down
  *   `save`: Saved but not shown in the template list
- `template_id` string (required)

  Source template id for `save_as` / the template to version up for `update`
- `title` object

  Template title (i18n map). Optional; defaults to the source template's title
- `category` string

  First-level category. Optional; defaults to source
- `second_category` string

  Second-level category. Optional; defaults to source
- `image` string

  Preview image filename. Optional; defaults to source
- `origin` string

  Origin type: `custom`, `global`. Optional; defaults to source

```json
{
  "action": "string",
  "template_id": "string",
  "title": {},
  "category": "string",
  "second_category": "string",
  "image": "string",
  "origin": "string"
}
```

## Responses

**200**

OK

**application/json**

**Schema | Example**

**Schema**

- `code` string

  error code
- `message` string

  error message
- `data` object

  - `id` string

    Saved template id. Always a new id — `update` also creates a new template and hides the one passed in `template_id`
  - `series_id` string

    Series id
  - `show_templates` int32

    Number of show templates

```json
{
  "code": "string",
  "message": "string",
  "data": {
    "id": "string",
    "series_id": "string",
    "show_templates": 0
  }
}
```
