API reference
POST /presentations/generate
Starts an asynchronous AI presentation generation job.
Parameters
Instruction for what to generate.
Template that seeds the generation. If omitted, Chronicle uses the Standalone
flow — a storyline outline is generated first, then slides. This is the same
path the product UI uses when a user creates a deck from a prompt without
picking a template.
Optional subset of section IDs from the template to include. If omitted, all
sections are included. Ignored on the Standalone path.
Optional list of files to ground the generation in. Each attachment is
uploaded via POST /uploads/create-target first;
the returned
download_url becomes this object’s url. When provided, every
field on each entry (id, url, file_name, type) is required.When true, Chronicle never pauses to ask clarifying questions and
auto-proceeds end-to-end. Required for automation integrations like n8n,
Zapier, Make, or MCP — anything that can’t pause mid-workflow to answer
follow-up questions. When false (default), Chronicle may return
awaiting_input and wait for a reply via POST
/presentations/generate/:generationId/message.Storyline archetype. One of
Pitch, Showcase, Sales, Proposal,
Research, Guide, Meeting, Portfolio, Auto. Defaults to Auto
(Chronicle picks). Only honored on the Standalone path (no template_id) with
non_interactive: true.How aggressively Chronicle rewrites your input prompt and any attachment
content. One of
Strong, Subtle, Preserve. Defaults to Subtle. Only
honored on the Standalone path with non_interactive: true.Target number of sections in the storyline. Pass a positive integer (for
example
5) or the string "auto" to let Chronicle decide. Defaults to
"auto". Only honored on the Standalone path with non_interactive: true.Output language. One of
us, uk, es, fr, de, it, pt, cn, in,
ja, ko, ar, hi, bn. Defaults to us (American English). Only
honored on the Standalone path with non_interactive: true.Response
A successful request returns202 Accepted. The workspace is inferred from your API key.
Generation job ID
Current generation status
Relative URL for checking generation status
FAQs
Is generation synchronous?
Is generation synchronous?
No. Generation is asynchronous.
The endpoint starts a generation job and returns a
generation_id. Use that ID to check status.What’s the difference between create and generate?
What’s the difference between create and generate?
Use
POST /api/v1/presentations to create from a template.Use POST /api/v1/presentations/generate to generate a presentation from a prompt.Can generation ask follow-up questions?
Can generation ask follow-up questions?
Yes — by default. Chronicle can pause generation and return
awaiting_input with a clarifying question.Set non_interactive: true on the request to skip this entirely. Chronicle will pick reasonable defaults and proceed silently. Required for automation tools that can’t pause mid-workflow.Do I need a template?
Do I need a template?
No. When
template_id is omitted, Chronicle uses the Standalone flow — it generates a storyline outline first, then slides. This is the same path the product UI uses when you create a deck from a prompt without picking a template.Pass template_id when you want Chronicle to stamp out a deck that matches a specific template’s structure.When are the structured storyline params honored?
When are the structured storyline params honored?
Only when
non_interactive: true AND template_id is omitted (the Standalone path).Outside that combination, Chronicle ignores narrative_type, rewrite_style, section_count, and language — the template defines structure in template-mode, and the interactive flow lets users clarify their preferences in chat.Can generation fail before it starts?
Can generation fail before it starts?
Yes. Chronicle can reject a generation request before processing begins, including when usage limits are exceeded.Handle these responses separately from authentication errors.
Can I attach files to ground generation?
Can I attach files to ground generation?
Yes. Upload each file via POST /uploads/create-target first, then pass the captured
download_url (with id, file_name, and type) in the attachments array.