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

# API scope and rate limits

> What the Chronicle v1 API covers, rate limits and how to work within its current scope.

## What the API covers

The REST API at `https://api.chroniclehq.com/api/v1` is workspace-scoped.
With a valid API key you can list templates, create and fetch presentations, update presentation metadata, upload reference files, poll job status, and send follow-up messages during generation.

| Method | Endpoint                                                                       | Description                                           |
| :----- | :----------------------------------------------------------------------------- | :---------------------------------------------------- |
| GET    | [`/templates`](/get-templates)                                                 | List available templates                              |
| GET    | [`/presentations/:id`](/get-presentations-id)                                  | Fetch an existing presentation                        |
| POST   | [`/presentations`](/post-presentations)                                        | Create a new presentation from a template             |
| POST   | [`/uploads/create-target`](/post-uploads-create-target)                        | Get a presigned S3 target for uploading an attachment |
| POST   | [`/presentations/generate`](/post-presentations-generate)                      | Start an AI presentation generation job               |
| GET    | [`/presentations/generate/:generationId/status`](/get-generation-status)       | Poll generation job status                            |
| POST   | [`/presentations/generate/:generationId/message`](/post-send-followup-message) | Send a follow-up message during generation            |
| PATCH  | [`/presentations/:id`](/patch-presentations-id)                                | Update presentation metadata (for example title)      |

For request and response field details, use the linked endpoint pages.

### Working outside the current scope

<AccordionGroup>
  <Accordion title="Updating content after generation">
    The API does not modify slide content after generation. Title can be updated
    via [PATCH /presentations/:id](/patch-presentations-id); for any other
    content change, generate a new presentation with the revised input.
  </Accordion>

  <Accordion title="Waiting for generation to complete">
    The API uses an asynchronous polling model. After creating a generation,
    poll [GET
    /presentations/generate/:generationId/status](/get-generation-status) until
    the status is completed or failed.
  </Accordion>

  <Accordion title="Exporting files">
    A completed presentation includes a URL for viewing the output. From there
    you can export, present as needed.
  </Accordion>

  <Accordion title="Generating images and structured content">
    Images, charts, and diagrams can be prompted through your input text. For
    more predictable layouts, use the template-based generation.
  </Accordion>
</AccordionGroup>

***

## Rate limits

Chronicle may apply rate limits per API key.

Example policy:

`20 requests per minute per key`

When rate limited, the API should return `429 Too Many Requests`.

Example response:

<CodeGroup>
  ```json Example response theme={null}
  {
    "error": {
      "code": "API_KEY_RATE_LIMITED",
      "message": "Rate limit exceeded",
      "status": 429
    }
  }
  ```
</CodeGroup>

For how `429` fits into client behavior, see [Error codes](/error-codes).

***

## Polling generation jobs

Generation workflows are asynchronous. When polling:

* Poll at a reasonable interval
* Stop polling when the job reaches a terminal state
* Back off on repeated failures
* Handle timeouts gracefully

See [GET /presentations/generate/:generationId/status](/get-generation-status) for the status response shape.

***

## Production best practices

* Log request IDs if available
* Log status codes and error types
* Retry only transient failures
* Surface useful error messages to operators
* Avoid aggressive polling loops

<Info>
  **Tip:** If your integration performs generation, most reliability issues come
  from polling too aggressively or not handling transient failures well.
</Info>

***

## Related posts

* [Error codes](/error-codes)
* [API reference](/api-reference)
* [Troubleshooting](/troubleshooting)
