> ## 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.

# Generate Slideshow

> Generate AI-powered slideshows for TikTok photo carousels, Instagram carousels, Pinterest pins, and more. Supports AI generation from prompts, manual slide configuration, and mixed mode. The core content creation endpoint for OpenClaw agents.

Create a new slideshow in the authenticated key scope. This is the core content creation endpoint - your OpenClaw agent or automation script generates slideshows here, then publishes them to media-capable accounts via [Create Post](/api-reference/create-post).

`generate` supports:

* AI generation from a prompt/product context
* manual initial slide setup (`skip_ai=true`)
* mixed setup with explicit `slide_config`

## Body Parameters

<ParamField body="prompt" type="string">
  Prompt used for AI text generation. Required unless `skip_ai=true` or `product_id` is provided.
</ParamField>

<ParamField body="product_id" type="string (UUID)">
  Optional product reference. Must exist in the authenticated key scope.
</ParamField>

<ParamField body="pack_id" type="string (UUID)">
  Optional global image pack ID. Required whenever any generated slide uses `image_pack` and no
  per-slide `pack_assignments` are provided.
</ParamField>

<ParamField body="slide_count" type="number">
  Optional target slide count (`1-10`). Default: `5`.
</ParamField>

<ParamField body="slideshow_type" type="string">
  Optional: `educational` or `personal`. Default: `educational`.
</ParamField>

<ParamField body="aspect_ratio" type="string">
  Optional: `9:16`, `1:1`, or `4:5`. Default: `4:5`.
</ParamField>

<ParamField body="language" type="string">
  Optional language hint (2-32 chars).
</ParamField>

<ParamField body="advanced_settings" type="object">
  Optional text styling defaults.

  <Expandable title="advanced_settings object">
    <ParamField body="font_size" type="string | number">
      `default`, `small`, or a numeric size (`8-200`). Preset mapping for generated slides:
      `default` = title/single `48px`, body `40px`; `small` = title/single `40px`, body `33px`
      (rounded from `0.83x`). If users ask for “a bit bigger than small”, use a numeric midpoint
      such as `44`.
    </ParamField>

    <ParamField body="text_preset" type="string">
      Text style preset (for example `tiktok`).
    </ParamField>

    <ParamField body="text_width" type="string">
      `default` or `narrow`.
    </ParamField>
  </Expandable>
</ParamField>

<ParamField body="skip_ai" type="boolean">
  Optional. When `true`, generation skips AI text creation and uses your `slide_config` input.
</ParamField>

<ParamField body="slide_config" type="object">
  Optional explicit per-slide setup.

  <Expandable title="slide_config object">
    <ParamField body="total_slides" type="number" required>
      Integer `1-10`.
    </ParamField>

    <ParamField body="slide_types" type="array" required>
      Exact-length array matching `total_slides`. Values: `image_pack` or
      `custom_image`.
    </ParamField>

    <ParamField body="custom_images" type="object">
      Map of slide index -> custom image payload. Required for every
      `custom_image` slide.
    </ParamField>

    <ParamField body="pinned_images" type="object">
      Optional map of slide index -> pinned image URL.
    </ParamField>

    <ParamField body="slide_texts" type="object">
      Optional map of slide index -> text string.
    </ParamField>

    <ParamField body="slide_text_elements" type="object">
      Optional map of slide index -> text element array
      (`content`, `x`, `y`, optional `id`, `font_size`, `width`).
    </ParamField>

    <ParamField body="pack_assignments" type="object">
      Optional map of slide index -> pack UUID. Valid only for `image_pack`
      slides.
    </ParamField>
  </Expandable>
</ParamField>

<Warning>
  All `slide_config` map keys must be 0-based numeric indices in range. `image_pack` slides must
  resolve a pack via `pack_id` or `pack_assignments[index]`.
</Warning>

## Examples

### AI mode (prompt + global pack)

```bash cURL theme={null}
curl --request POST \
  --url https://www.genviral.io/api/partner/v1/slideshows/generate \
  --header 'Authorization: Bearer <token>' \
  --header 'Content-Type: application/json' \
  --data '{
  "prompt": "5 discipline quotes",
  "pack_id": "11111111-1111-1111-1111-111111111111",
  "slide_count": 1,
  "slideshow_type": "educational",
  "aspect_ratio": "4:5",
  "language": "en",
  "advanced_settings": {
    "font_size": 44,
    "text_preset": "tiktok",
    "text_width": "default"
  }
}'
```

### Manual mode (`skip_ai=true`)

```bash cURL theme={null}
curl --request POST \
  --url https://www.genviral.io/api/partner/v1/slideshows/generate \
  --header 'Authorization: Bearer <token>' \
  --header 'Content-Type: application/json' \
  --data '{
  "skip_ai": true,
  "slide_config": {
    "total_slides": 2,
    "slide_types": ["custom_image", "image_pack"],
    "custom_images": {
      "0": {
        "image_url": "https://cdn.example.com/custom-0.jpg",
        "image_id": "hero_0"
      }
    },
    "slide_text_elements": {
      "0": [
        {
          "content": "Hook text",
          "x": 50,
          "y": 25
        }
      ]
    },
    "pack_assignments": {
      "1": "11111111-1111-1111-1111-111111111111"
    }
  }
}'
```

## Response

Returns `201` with the full slideshow object (same structure as
[Get Slideshow](/api-reference/get-slideshow)).

```json Response theme={null}
{
  "ok": true,
  "code": 201,
  "message": "Slideshow generated",
  "data": {
    "id": "2ab58bb0-0c39-45c0-a4d5-b6852f9d7fc0",
    "title": "5 discipline quotes",
    "status": "draft",
    "slideshow_type": "educational",
    "product_id": null,
    "original_prompt": "5 discipline quotes",
    "preview_image_url": null,
    "created_at": "2026-02-14T09:20:00.000Z",
    "updated_at": "2026-02-14T09:20:00.000Z",
    "last_rendered_at": null,
    "slide_count": 1,
    "settings": {
      "image_pack_id": "11111111-1111-1111-1111-111111111111",
      "aspect_ratio": "4:5",
      "slideshow_type": "educational",
      "advanced_settings": {
        "font_size": 44,
        "text_preset": "tiktok",
        "text_width": "default"
      },
      "pack_assignments": null
    },
    "slides": [
      {
        "index": 0,
        "image_url": "https://cdn.example.com/slides/discipline-1.jpg",
        "rendered_image_url": null,
        "text_elements": [
          {
            "id": "9fd0b2bd-a95a-4488-8b7a-bf1d18d2bcdf",
            "content": "Discipline beats motivation",
            "x": 50,
            "y": 25,
            "font_size": 48,
            "width": 70,
            "height": null,
            "editable": true,
            "style_preset": "tiktok",
            "font_family": null,
            "background_color": null,
            "text_color": null,
            "border_radius": null
          }
        ],
        "grid_images": null,
        "grid_type": null,
        "background_filters": null,
        "image_overlays": null
      }
    ]
  }
}
```

## Error Responses

* `400 invalid_json` - body is not valid JSON
* `422 invalid_payload` - schema/validation failed
* `404 pack_not_found` - referenced pack is missing or outside key scope
* `422 pack_empty` - selected pack has no images
* `422 pack_required` - one or more `image_pack` slides are missing pack resolution
* `404 product_not_found` - `product_id` does not exist
* `403 forbidden_product_access` - `product_id` exists but is outside key scope
* `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 generate_failed` - unexpected generation failure
