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

# Derive a presentation from an existing deck

> Clone an Open Source presentation, patch selected slides, and keep the original unchanged.

Use `POST /api/v1/ppt/presentation/derive` to create a new presentation from an existing one. Presenton copies every slide, deep-merges the supplied content into the selected indices, exports the new deck, and returns a new presentation ID.

## Choose edit or derive

| Goal                     | Endpoint               | Result                                  |
| ------------------------ | ---------------------- | --------------------------------------- |
| Update the existing deck | `/presentation/edit`   | The original presentation ID is changed |
| Create a variation       | `/presentation/derive` | A new presentation ID is created        |

Derive is useful for customer-specific decks, localized variants, recurring reports, and any workflow that needs an immutable source presentation. The example below turns a reviewed customer-business-review master into a Northstar Logistics renewal deck.

## Inspect the source

Fetch the presentation before preparing a patch:

```bash theme={null}
curl --request GET \
  --url "$PRESENTON_URL/api/v1/ppt/presentation/$PRESENTATION_ID" \
  --user "$PRESENTON_USERNAME:$PRESENTON_PASSWORD"
```

Use `slides[].index` as the target and match field names already present in `slides[].content`. Indices are zero-based.

Assume the source deck returns `title` and `subtitle` on slide 0, and `title` and `body` on slide 4. The example patches only those confirmed fields; use the keys from your own source deck.

## Create the derived deck

```bash theme={null}
curl --request POST \
  --url "$PRESENTON_URL/api/v1/ppt/presentation/derive" \
  --user "$PRESENTON_USERNAME:$PRESENTON_PASSWORD" \
  --header 'Content-Type: application/json' \
  --data "{
    \"presentation_id\": \"$PRESENTATION_ID\",
    \"slides\": [
      {
        \"index\": 0,
        \"content\": {
          \"title\": \"Northstar Logistics — Q3 Business Review\",
          \"subtitle\": \"Renewal decision and 2027 expansion plan\"
        }
      },
      {
        \"index\": 4,
        \"content\": {
          \"title\": \"Renewal risk and mitigation\",
          \"body\": \"Analytics adoption is limited to two regions. Complete manager enablement by October 15 and review weekly-active-user adoption with the executive sponsor every two weeks.\"
        }
      }
    ],
    \"export_as\": \"pdf\"
  }"
```

A successful response points to the new presentation:

```json theme={null}
{
  "presentation_id": "NEW_PRESENTATION_ID",
  "path": "/app_data/exports/Northstar Logistics — Q3 Business Review.pdf",
  "edit_path": "/presentation?id=NEW_PRESENTATION_ID"
}
```

The source ID remains unchanged. Open the returned `edit_path` to review the derived deck visually.

## Batch variations

Keep a canonical source ID and call derive once per audience or dataset. Store the relationship in your application:

```json theme={null}
{
  "source_presentation_id": "SOURCE_ID",
  "derived_presentation_id": "NEW_PRESENTATION_ID",
  "variant_key": "northstar-logistics-q3-2026"
}
```

Do not derive repeatedly from an already customized variant unless that inheritance is intentional. Starting each run from the same canonical deck keeps output predictable.

## Production checklist

* Confirm the source deck is the expected version.
* Validate every target index before sending the request.
* Preserve the returned new ID with the source ID and variant metadata.
* Review the export for overflow after inserting longer customer-specific text.
* Delete obsolete variants according to your retention policy.

<Card title="Edit in place" icon="pen-to-square" href="/open-source/v0.9.0-beta/guides/edit-presentation">
  Update an existing presentation when a separate copy is not required.
</Card>
