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

# POST /presentations

> Creates a new presentation from an existing template.

<RequestExample>
  ```shellscript cURL theme={null}
  curl "https://api.chroniclehq.com/api/v1/presentations" \
    -X POST \
    -H "Authorization: Bearer $API_KEY" \
    -H "Content-Type: application/json" \
    -d '{
      "template_id": "tpl_123"
    }'
  ```

  ```javascript JavaScript theme={null}
  const response = await fetch("https://api.chroniclehq.com/api/v1/presentations", {
    method: "POST",
    headers: {
      Authorization: `Bearer ${API_KEY}`,
      "Content-Type": "application/json",
    },
    body: JSON.stringify({
      template_id: "tpl_123",
    }),
  });

  const data = await response.json();
  console.log(data);
  ```
</RequestExample>

### Parameters

<ParamField body="template_id" type="string" required>
  The template to create from
</ParamField>

<ParamField body="selected_section_ids" type="string[]">
  Optional subset of section IDs from the template to include. If omitted, all sections are included.
</ParamField>

### Response

A successful request returns `201 Created`. The workspace is inferred from your API key.

<ResponseExample>
  ```json Response theme={null}
  {
    "id": "pres_123",
    "title": "Q2 Business Review",
    "workspace_id": "ws_123",
    "sections": [],
    "is_public": false,
    "url": "https://app.chroniclehq.com/ws_123/document/pres_123",
    "created_at": "2026-04-30T00:00:00.000Z",
    "updated_at": "2026-04-30T00:00:00.000Z"
  }
  ```
</ResponseExample>

<ResponseField name="id" type="string">
  Presentation ID
</ResponseField>

<ResponseField name="title" type="string">
  Presentation title
</ResponseField>

<ResponseField name="workspace_id" type="string">
  Workspace ID that owns the presentation
</ResponseField>

<ResponseField name="sections" type="array">
  Presentation slides
</ResponseField>

<ResponseField name="is_public" type="boolean">
  Whether the presentation is public
</ResponseField>

<ResponseField name="url" type="string">
  Canonical presentation URL
</ResponseField>

<ResponseField name="created_at" type="string">
  ISO timestamp when the presentation was created
</ResponseField>

<ResponseField name="updated_at" type="string">
  ISO timestamp when the presentation was last updated
</ResponseField>

***

## FAQs

<AccordionGroup>
  <Accordion title="What does this endpoint do?">
    This endpoint creates a presentation from an existing template.

    Use it when you already know which template you want to use.
  </Accordion>

  <Accordion title="Can I create a presentation without a template?">
    No. This endpoint creates presentations from templates.

    If you want Chronicle to generate a presentation from a prompt, use the [generate](/post-presentations-generate) endpoint instead.
  </Accordion>

  <Accordion title="Should I hardcode template IDs?">
    No. Fetch templates first, then use the returned template ID.

    That keeps your integration aligned with the templates available to the workspace.
  </Accordion>
</AccordionGroup>

***

## Related posts

* [GET /templates](/get-templates)
* [GET /presentations/:id](/get-presentations-id)
* [Error codes](/error-codes)
