Skip to main content
POST /slides/generate produces professional .pptx output from a natural-language prompt. The agent designs a cohesive visual system — one palette, a consistent type scale, and visual pacing across hero, content, and section-break slides — and populates each slide with the right layout for its content. Use it to automate investor decks, sales presentations, quarterly reviews, and training materials. The agent thinks like a senior UI/UX designer: it picks layout types per slide, applies contrast rules, and avoids back-to-back slides with the same layout family.

Request parameters

prompt
string
required
Natural-language description of the deck you want. Up to 10,000 characters. Describe the purpose, audience, tone, and slide count. Explicit hints like “dark-navy theme” or “Series B pitch deck” are respected.
run_id
string
Resume an existing run. Pass the run_id from a previous response to add, replace, or restyle slides in the existing deck. Use this to build decks larger than 30 slides in chunks.
init_file
string
file_id of an existing .pptx to edit in-place. Upload the file first with POST /files (purpose: "init").
image_assets
array
Images to embed in the deck. Each entry is an object with image_id and tags. Upload images first with POST /images. If your prompt references images but none are attached, the preflight validator rejects the request with 400 preflight_failed: missing=["images"].
brand
object
Brand configuration object to enforce your visual identity. Accepts primary_color (hex string), font (font family name), and logo_url. The agent threads these through headers, accents, dividers, and the closing CTA.
async
boolean
default:"false"
Set to true to run the job asynchronously. The response returns a task_id immediately. Use webhook_url to receive the result, or poll GET /tasks/{task_id}.
webhook_url
string
URL to receive a POST when the async job completes. See Webhooks.
file_name
string
Override the default output filename.
idempotency_key
string
Supply a unique key to safely retry requests without producing duplicate runs.

Quickstart

1

Generate a deck

Send a prompt describing the presentation. The response includes a download_url for the finished .pptx.
import requests

API = "https://backend.overtenai.com/api/v1"
KEY = "sk_live_..."

resp = requests.post(
    f"{API}/slides/generate",
    headers={"Authorization": f"Bearer {KEY}"},
    json={
        "prompt": (
            "10-slide Q3 investor update for our SaaS company. "
            "Focus: MRR growth, churn reduction, Q4 roadmap. "
            "Visual style: clean, minimal, dark navy accents."
        ),
    },
)
print(resp.json()["download_url"])
2

Download the file

Fetch the download_url to retrieve the .pptx. The URL is a signed link valid for 1 hour.

Response shape

A successful synchronous response looks like this:
{
  "run_id": "run_ghi789",
  "status": "completed",
  "download_url": "https://storage.overtenai.com/...",
  "summary": "10-slide investor update with hero opener, MRR trend chart, churn slide, Q4 roadmap, and closing CTA.",
  "credits_used": 60,
  "duration_ms": 22100
}
FieldDescription
run_idUse this to resume the run, add slides, or export to another format.
download_urlSigned URL for the .pptx file. Valid for 1 hour.
summaryAgent’s description of the deck it built.
credits_usedCredits deducted for this call.

Presentation modes

The agent picks the right mode from the prompt, but you can nudge it explicitly:
ModeSignal wordsTypical output
Visual-first / minimal”pitch deck”, “narrative”, “storytelling”, “clean”Big hero images, few bullets, emphasis on hierarchy
Balanced”investor update”, “business review”Mix of visual and data; moderate text density
Information-dense”technical deep-dive”, “detailed analysis”, “academic”Tighter layouts, more tables and charts, appendix-friendly
For pitch decks, keynotes, and executive summaries, the agent defaults to visual-first. For internal reporting and technical content, it leans information-dense.

Common use cases

Pitch decks with brand customization

Pass a brand object to enforce your visual identity across every slide.
import requests

API = "https://backend.overtenai.com/api/v1"
headers = {"Authorization": f"Bearer sk_live_..."}

resp = requests.post(f"{API}/slides/generate", headers=headers, json={
    "prompt": "10-slide pitch deck on our Series B round",
    "brand": {
        "primary_color": "#2E75B6",
        "font": "Inter",
        "logo_url": "https://cdn.acme.com/logo.svg",
    },
})
print(resp.json()["download_url"])

Decks with product screenshots

Upload your images first, tag them, then reference them in the prompt. The agent places images in the layout that fits best.
hero = requests.post(
    f"{API}/images", headers=headers,
    files={"file": open("hero.png", "rb")},
    data={"caption": "Q3 hero", "tags": '["hero"]'},
).json()

product = requests.post(
    f"{API}/images", headers=headers,
    files={"file": open("dashboard.png", "rb")},
    data={"tags": '["product", "screenshot"]'},
).json()

resp = requests.post(f"{API}/slides/generate", headers=headers, json={
    "prompt": "10-slide pitch deck with product screenshots on slides 4 and 6",
    "image_assets": [
        {"image_id": hero["image_id"], "tags": ["hero"]},
        {"image_id": product["image_id"], "tags": ["product"]},
    ],
})

Editing an existing deck

Upload your draft .pptx and target specific slides to replace.
upload = requests.post(
    f"{API}/files", headers=headers,
    files={"file": open("deck_draft.pptx", "rb")},
    data={"purpose": "init"},
).json()

resp = requests.post(f"{API}/slides/generate", headers=headers, json={
    "prompt": "Replace slide 3 with a KPI summary showing three metric cards",
    "init_file": upload["file_id"],
})

Outline-first workflow

Use POST /slides/outline to generate just the slide titles and bullets before committing to a full deck build. This is useful for preview and approval workflows.
# Step 1: Generate the outline
outline_resp = requests.post(
    f"{API}/slides/outline",
    headers=headers,
    json={
        "prompt": "10-slide Series B pitch deck",
        "slide_count_hint": 10,
    },
)
outline = outline_resp.json()
# → {"outline": [{"title": "...", "bullets": [...]}, ...]}

# Step 2: Once approved, build the full deck
deck_resp = requests.post(
    f"{API}/slides/generate",
    headers=headers,
    json={
        "run_id": outline_resp.json().get("run_id"),
        "prompt": "Now build the full deck from this outline",
    },
)

Building decks larger than 30 slides

Each call to /slides/generate supports a maximum of 30 slides. Build larger decks by calling the endpoint in chunks using run_id to resume.
# Chunk 1: slides 1-20
r1 = requests.post(f"{API}/slides/generate", headers=headers, json={
    "prompt": "Build slides 1-20 of a 40-slide technical training deck on Kubernetes.",
}).json()

# Chunk 2: slides 21-40, using the same run_id
r2 = requests.post(f"{API}/slides/generate", headers=headers, json={
    "run_id": r1["run_id"],
    "prompt": "Continue with slides 21-40: advanced topics, debugging, and Q&A.",
}).json()
Follow-up chunks are cheaper because the agent remembers the deck’s palette, type scale, and layout system from the first call.

Exporting to other formats

Convert a completed run to PDF, PNG, or ODP using POST /runs/{run_id}/export.
export = requests.post(
    f"{API}/runs/{run_id}/export",
    headers=headers,
    json={"format": "pdf"},
)
print(export.json()["download_url"])
Supported export formats for Slides runs: pdf, png, odp.

Slide types

The agent builds three canonical slide types. Visual pacing rules prevent more than two consecutive slides with the same layout family.

Hero

Dark or accent background, bold headline. Opening and closing slides default to this type.

Content

White or light background, 3-5 bullets max, consistent type scale.

Section break

Gradient tint, large section title. Transitions between major chapters.

Things to be aware of

  • Image search is not available. The API does not generate or search for images. Upload what you want to use via POST /images.
  • Max 30 slides per call. Use run_id to build larger decks in chunks.
  • Speaker notes are supported. Ask for them explicitly in your prompt: “add speaker notes under each slide for the presenter.” They travel with the .pptx and appear in PowerPoint, Keynote, and Google Slides presenter view.
  • Layout selection is agent-driven. Describe the layout you want in your prompt (“use a three-column comparison on slide 4”, “make slide 7 a big-number KPI card”) and the agent matches to the closest supported pattern.

Tips for better results

State the deck’s purpose and audience before describing individual slides. “10-slide investor update for a Series B SaaS company, formal tone, dark navy theme” gives the agent enough context to design the full visual system before writing any content.
  • Request speaker notes upfront if you need them — it’s harder to add them in a follow-up turn.
  • Specify chart types explicitly if a particular visualization matters: “use a line chart for MRR growth, not a bar chart”.
  • For decks with brand guidelines, always pass the brand object rather than describing colors in the prompt.
  • Use the outline endpoint first for large or high-stakes decks, so you can approve the structure before the agent builds everything.
  • Runs and tasksrun_id lifecycle, task polling, and status values
  • Async vs sync — when to use async: true and how to handle results
  • Preflight — validate your request before committing credits
  • Credits — how generation costs are calculated