> ## Documentation Index
> Fetch the complete documentation index at: https://docs.genviral.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Create Template From Slideshow

> Convert an existing slideshow into a reusable template

Builds a template from an existing slideshow in key scope.

## Path Parameters

<ParamField path="slideshowId" type="string" required>
  Source slideshow UUID.
</ParamField>

## Body Parameters

<ParamField body="name" type="string">
  Optional template name (`1-100` chars). If omitted, API auto-generates one.
</ParamField>

<ParamField body="description" type="string">
  Optional description (`<=500` chars).
</ParamField>

<ParamField body="visibility" type="string">
  Optional: `private` or `workspace`. Default: `private`.
</ParamField>

<ParamField body="preserve_text" type="boolean">
  Optional. Default: `true`. Controls whether text is kept in converted config.
</ParamField>

<Note>
  Empty body is valid (`{}` behavior). The API will generate a name and apply
  defaults.
</Note>

<RequestExample>
  ```bash cURL theme={null}
  curl --request POST \
    --url https://www.genviral.io/api/partner/v1/templates/from-slideshow/2ab58bb0-0c39-45c0-a4d5-b6852f9d7fc0 \
    --header 'Authorization: Bearer <token>' \
    --header 'Content-Type: application/json' \
    --data '{
    "name": "Converted Winner",
    "description": "Built from a high-performing slideshow",
    "visibility": "workspace",
    "preserve_text": true
  }'
  ```
</RequestExample>

<ResponseExample>
  ```json Response theme={null}
  {
    "ok": true,
    "code": 201,
    "message": "Template created",
    "data": {
      "id": "bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb",
      "name": "Converted Winner",
      "description": "Built from a high-performing slideshow",
      "visibility": "workspace",
      "preview_url": null,
      "use_count": 0,
      "last_used_at": null,
      "created_at": "2026-02-14T10:05:00.000Z",
      "updated_at": "2026-02-14T10:05:00.000Z",
      "is_owner": true,
      "config": {
        "version": 1,
        "structure": {
          "slides": [
            {
              "type": "pack",
              "id": "11111111-1111-1111-1111-111111111111",
              "pinnedImageUrl": null,
              "textElements": [
                {
                  "id": "22222222-2222-2222-2222-222222222222",
                  "content": "Hook text",
                  "x": 50,
                  "y": 25,
                  "fontSize": 48,
                  "width": 70
                }
              ]
            }
          ]
        },
        "content": {
          "mode": "manual",
          "productId": null,
          "language": "en",
          "slideshowType": "educational"
        },
        "visuals": {
          "packId": null,
          "aspectRatio": "4:5",
          "textSettings": {
            "fontSize": "default",
            "preset": "tiktok",
            "width": "default"
          }
        }
      }
    }
  }
  ```
</ResponseExample>

## Error Responses

* `400 missing_slideshow_id` - path param missing
* `400 invalid_json` - body is not valid JSON
* `422 invalid_payload` - schema validation failed
* `404 slideshow_not_found` - source slideshow not found in key scope
* `409 template_name_conflict` - name already exists for owner
* `422 invalid_template_config` - generated/normalized config failed validation
* `401` - authentication failed (missing/invalid/revoked token)
* `402 subscription_required` - active Creator/Professional/Business plan required
* `403 tier_not_allowed` - Scheduler tier cannot use Partner API
* `500 template_create_failed` - unexpected conversion failure
