# Welcome to Twistly

Twistly (listed on the Microsoft AppSource marketplace as **GPT for PowerPoint**) is an AI add-in that works inside PowerPoint. It creates complete presentations from a topic, a document, or pasted text — and helps you improve existing slides with AI editing, redesign, speaker notes, and images. Everything happens directly in your open presentation; there is nothing to export or import.

## Where Twistly works

* PowerPoint for Windows
* PowerPoint for Mac
* PowerPoint for the web

## Try it free

Every new user can generate **3 presentations for free** — no payment details required, and you can start before creating an account. See [Free Plan & Credits](/getting-started/free-plan-and-credits).

Get started in one click:

* [Quick install](https://pages.store.office.com/addinsinstallpage.aspx?assetid=WA200005566) — the Microsoft AppSource install page.
* [Try in PowerPoint on the web](https://go.microsoft.com/fwlink/?linkid=2261820\&templateid=WA200005566\&templatetitle=GPT%20for%20PowerPoint) — opens a new presentation in your browser with the add-in ready. Nothing to install.
* [Quick launch in desktop PowerPoint](ms-powerpoint:https://api.addins.store.office.com/addinstemplate/en-US/93b57bf5-a992-54b8-8b63-543c6c8601e6/WA200005566/none/GPT-for-PowerPoint.pptx?omexsrctype=1) — opens PowerPoint with the add-in preloaded (requires PowerPoint installed on this device).

## Where to go next

| I want to...                   | Go to                                                                |
| ------------------------------ | -------------------------------------------------------------------- |
| Install the add-in             | [Install & Open](/getting-started/install-and-open)                  |
| Create my first presentation   | [How Creating Works](/create-a-presentation/how-creating-works)      |
| Improve slides I already have  | [Edit & Improve Slides](/edit-and-improve-slides/edit-text-with-ai)  |
| Use my company's template      | [Custom Templates](/custom-templates-pro-and-team/upload-a-template) |
| Compare plans                  | [Plans & What's Included](/plans-billing-and-team/plans)             |
| Automate presentation creation | [API Access](/plans-billing-and-team/api-access)                     |
| Fix a problem                  | [Troubleshooting](/help/troubleshooting)                             |


# Install & Open

## Install

1. Open PowerPoint and go to **Home → Add-ins** (in some PowerPoint versions: **Insert → Get Add-ins**).
2. Search for **GPT for PowerPoint**.
3. Select **Add** and accept the license terms.

The Twistly button appears on the **Home** ribbon. Installation adds nothing to your computer beyond the add-in itself — it runs inside PowerPoint.

{% hint style="info" %}
**GPT for PowerPoint** is Twistly's name on the Microsoft AppSource marketplace — it's the same add-in.
{% endhint %}

### Install in one click

Skip the store search with these direct links:

* [**Quick install**](https://pages.store.office.com/addinsinstallpage.aspx?assetid=WA200005566) — opens the AppSource install page; select **Get it now** and follow the prompts.
* [**PowerPoint on the web**](https://go.microsoft.com/fwlink/?linkid=2261820\&templateid=WA200005566\&templatetitle=GPT%20for%20PowerPoint) — opens a new presentation in PowerPoint for the web with the add-in already loaded. Nothing to install; works on any computer.
* [**Quick launch (desktop)**](ms-powerpoint:https://api.addins.store.office.com/addinstemplate/en-US/93b57bf5-a992-54b8-8b63-543c6c8601e6/WA200005566/none/GPT-for-PowerPoint.pptx?omexsrctype=1) — opens desktop PowerPoint with the add-in preloaded. Requires PowerPoint installed on this device.

## Open

Click the **Twistly** button on the Home ribbon. The add-in opens as a panel on the right side of your presentation. You can start creating immediately — signing in is optional at first (see [Sign In & Your Account](/getting-started/sign-in-and-account)).

## The add-in doesn't appear?

* **Restart PowerPoint** after installing — the ribbon button sometimes appears only after a restart.
* **Update Office.** Very old PowerPoint versions may not show the Add-ins store. Use **File → Account → Update Options → Update Now**.
* **Work or school account:** your Microsoft 365 administrator may have restricted add-in installation. If the store shows the add-in but **Add** is unavailable, ask your admin to approve Twistly (they can deploy it from the Microsoft 365 admin center). While you wait, you can use the web version at [app.twistly.ai](https://app.twistly.ai/) — no installation needed.
* **Multiple accounts:** make sure PowerPoint is signed in with the account you installed the add-in under.

If none of this helps, see [Troubleshooting](/help/troubleshooting) or [contact us](/help/contact-us).


# Sign In & Your Account

## You can start without an account

Twistly works the moment you open it — your free presentations are available right away, tied to the device you're using. Signing in becomes required only when you purchase a plan.

## Sign-in options

* **Microsoft account**
* **Google account**
* **Email** — enter your email address and confirm with a **6-digit code** we send you. No password needed.

There are no passwords and no separate registration step: whichever option you choose, your Twistly account is created automatically the first time you sign in. Microsoft and Google sign-in opens in a popup window — if nothing appears, check that your browser or PowerPoint isn't blocking popups.

{% hint style="info" %}
Your Twistly sign-in is **independent of the account PowerPoint itself is signed into**. If you have a paid plan, sign in inside the add-in with the exact email you used at purchase — even if PowerPoint is signed in with a different work or school account. It doesn't need to be a Microsoft account.
{% endhint %}

## What signing in gives you

* Your plan and remaining free presentations follow you **across devices** — sign in on another computer and everything is there.
* Anything you used before signing in on this device (including your remaining free presentations) **carries over** to your account. You don't lose your free balance by signing in.

## Good to know

* **Sessions renew automatically** — you won't be asked to sign in again under normal use.
* **Email code not arriving?** It can take a few minutes — check the Spam and Promotions folders. Each code works once; if it expired, request a new one.
* **Asked to sign in repeatedly?** This usually happens when more than one Twistly account has been used on the same device. Sign in with the account that holds your plan.
* **Purchases require sign-in.** If you start a purchase while signed out, Twistly asks you to sign in first and then continues to checkout automatically.
* **Signing out** is available from the add-in's settings. It doesn't affect your presentations — they're your PowerPoint files.
* **New computer?** There's nothing to transfer or restore — install the add-in and sign in with the same email. Your plan follows your account.
* **Changed email address?** (left a job, switched accounts) [Contact us](/help/contact-us) and we can move your subscription to your new email.


# Free Plan & Credits

## 3 free presentations

New users receive **60 credits**. Creating a presentation — from a topic, text, or a file — costs **20 credits**, so you can generate **3 full presentations for free**.

* Credits are only deducted when a generation **succeeds**. A failed or cancelled generation doesn't cost anything.
* No payment details are needed, and you can use your free presentations before signing in.
* Free presentations are capped at **10 slides** each.

## What's free vs. paid

**Always free, on any plan:**

* Searching and inserting **stock and web images**
* Adding **blank and pre-designed sample slides** (contacts, team, thank-you)
* The **Twistly Agent** chat

**Included in every paid plan (Starter, Pro, Team):**

* Unlimited presentation creation (no credits)
* AI-generated single slides
* Edit Text with AI
* Redesign
* Speaker Notes
* AI image generation
* Removing the "made with" badge

**Pro & Team only:**

* [Custom templates](/custom-templates-pro-and-team/upload-a-template)
* [API access](/plans-billing-and-team/api-access)

## When your free presentations run out

You'll see a message offering to upgrade. Free features listed above keep working. See [Plans & What's Included](/plans-billing-and-team/plans) to compare options.


# Uninstall Twistly

1. In PowerPoint, go to **Home → Add-ins**.
2. Select **More Add-ins** (or the **...** menu on the Twistly add-in).
3. Find **Twistly** and choose **Remove**.
4. Confirm.

{% hint style="warning" %}
**Uninstalling does not cancel a paid subscription.** The add-in and your subscription are separate — if you remove the add-in while subscribed, billing continues. Cancel your plan first: see [Cancel or Pause a Subscription](/plans-billing-and-team/cancel-or-pause). You can also cancel without the add-in installed at [twistly.ai/manage-subscription](https://twistly.ai/manage-subscription/).
{% endhint %}

Uninstalling doesn't affect your presentations — everything Twistly created is part of your PowerPoint files and stays exactly as it is. If you reinstall later and sign in with the same account, your plan and account settings are restored.


# How Creating Works

There are three ways to create a presentation:

* **From a topic** — describe what you need and the AI writes everything. See [From a Topic](/create-a-presentation/from-a-topic).
* **From text** — paste your own content and the AI turns it into slides.
* **From a file** — upload a document (Word, PDF, PowerPoint, and more). See [From Text or a File](/create-a-presentation/from-text-or-file).

All three follow the same path:

1. **Content** — enter your topic, text, or file, and choose settings like slide count and language.
2. **Template** — pick a design. See [Templates](/create-a-presentation/templates).
3. **Generation** — the AI writes and designs the deck.
4. **Review** — check and edit the generated slides before anything touches your presentation. See [Review & Edit Before Inserting](/create-a-presentation/review-and-edit).
5. **Insert** — the finished slides are added to your open presentation.

## Things worth knowing

* **Generation takes a few minutes** — longer for bigger decks and large files. While you wait you can play one of the built-in mini-games (Snake, Pong, Memory, Tic-Tac-Toe).
* **The review step shows your actual slides**, not a draft outline. What you edit there is exactly what lands in PowerPoint.
* **Cancel really cancels.** Stopping a generation aborts the work entirely — nothing is inserted and nothing is charged.
* **Slides are inserted into the presentation you have open.** If you want a standalone deck, start from a new blank presentation.
* **Your settings are remembered.** Language, content style, tone, and other choices persist between sessions.


# From a Topic

Describe what you need and Twistly writes the whole presentation — structure, text, visuals.

## Writing a good topic prompt

A short phrase works ("Q3 marketing results"), but a sentence or two of direction gets noticeably better results. Useful ingredients:

* **Goal** — what should the presentation achieve?
* **Audience** — who is it for? ("for new employees", "for investors")
* **Emphasis** — what must be included or avoided?

> *"Onboarding presentation for new sales hires: our product line, target customers, and the first 30 days. Friendly tone, end with a checklist."*

Keep it focused — the field suggests up to about 450 characters, which is plenty for a well-aimed prompt. There's no need to specify formatting or slide-by-slide structure; the settings below handle that better.

{% hint style="info" %}
If you paste a large amount of text into the topic field, Twistly switches to **Create from Text** automatically — the right tool for ready-made content.
{% endhint %}

## Settings

* **Language** — 38 languages available. Defaults to **Auto**, which matches your prompt.
* **Number of slides** — see [Number of Slides](/create-a-presentation/number-of-slides).
* **Content** — how much text appears on slides: **Short**, **Detailed**, or **Bullet Points**.
* **Tone, presentation type, and audience** — optional menus that steer the writing style.
* **Image source and style** — see [Images in Your Presentation](/create-a-presentation/images).

All settings are remembered for next time.

## Cost

Free plan: 20 credits (one of your 3 free presentations). Paid plans: unlimited.


# From Text or a File

Turn existing content — a report, article, meeting notes, or an old deck — into a presentation.

## From text

Paste your content into the text field. How much you can paste depends on your plan:

| Plan       | Maximum length |
| ---------- | -------------- |
| Free       | 3,000 words    |
| Starter    | 7,000 words    |
| Pro / Team | 292,000 words  |

## From a file

**Supported formats:** `.pdf`, `.docx`, `.pptx`, `.txt`, `.xlsx`, `.xls`, `.html` **Maximum size:** 300 MB, one file per generation.

### Two ways to use a file

When you upload a **PowerPoint file or a landscape PDF** (typically an exported deck), Twistly asks what you want:

* **Redesign my presentation** — keeps your content, structure, and images and applies a new template. Slides map closely one-to-one to the original, and the result is inserted directly (no review step).
* **Create new from this file** — the AI restructures and rewrites the content into a fresh presentation, which you review before inserting.

For other documents (Word, portrait PDFs, text), Twistly extracts the essentials and condenses them into slides — it won't reproduce the document page by page.

## Good to know

* **Output language follows your source.** There's no language picker in this flow — a German document produces German slides. To change the language, translate the result afterwards with [Edit Text with AI](/edit-and-improve-slides/edit-text-with-ai).
* **Images from your document are reused** where they fit. For PDFs longer than 50 pages, image extraction is less reliable — expect more stock/AI images in the result.
* **Don't leave the review step open too long.** Images extracted from your file are held temporarily; if you wait more than \~15 minutes before continuing, slides may fall back to stock or AI images instead.
* **Tables survive.** Tables in your source arrive as real, editable PowerPoint tables.

## Cost

Free plan: 20 credits (one of your 3 free presentations). Paid plans: unlimited.


# Number of Slides

Set the slide count with the slider or type a number. The maximum depends on your plan:

| Plan       | Maximum slides per presentation |
| ---------- | ------------------------------- |
| Free       | 10                              |
| Starter    | 15                              |
| Pro / Team | 50                              |

## Auto

Leave the setting on **Auto** (or type "auto") and the AI chooses a slide count that fits your content — more input material generally means more slides.

## Why you might get a different number than you asked for

* **More slides:** if a slide would be overcrowded, Twistly splits it into two (you'll see titles like "Results 1/2", "Results 2/2") rather than cramming or cutting content. Large tables may also continue onto extra slides.
* **PowerPoint files and landscape PDFs** in "Redesign my presentation" mode map roughly one slide per source slide/page, regardless of the slider.

If the deck comes out longer than you want, the fastest fix is deleting or merging slides on the [review step](/create-a-presentation/review-and-edit) before inserting.


# Templates

Twistly ships with **51 professionally designed templates in 80+ color themes**, each named after a city (Tokyo, New York, Berlin, Madrid...). All built-in templates are available on every plan, including Free. Slides are composed from **25+ smart layouts** — the AI picks the layout that fits each slide's content.

## Picking a template

* **Click once** to select, or **double-click** to select and continue in one step.
* **Preview** opens a larger view with sample layouts (title, agenda, text, table, timeline) so you can judge the template on real slide types. Arrow through templates without leaving the preview.
* Your own [custom templates](/custom-templates-pro-and-team/upload-a-template) (Pro & Team) always appear **first** in the grid.

## AI Picks

When you reach the template step, Twistly analyzes your content and marks up to **3 templates with an "AI Pick" ribbon**, moving them to the front. Two things to know:

* The recommendation is **advisory only** — whichever template you click is what's used.
* You can turn it off with the **AI Recommendations** switch at the bottom of the picker; the choice is remembered.

## Colors

Each template comes with its color themes, and the original ten city templates offer several color variants. The AI applies your chosen template's palette to everything it generates — including charts and AI images, which are matched to the template's accent colors.


# Images in Your Presentation

When generating a presentation, Twistly fills image placeholders from one of three sources:

| Source                  | What it is                                                                  |
| ----------------------- | --------------------------------------------------------------------------- |
| **AI Images** (default) | Generated images matched to each slide's content and your template's colors |
| **Stock Images**        | Professional stock photography (Pexels)                                     |
| **Web Images**          | Image search results from the web                                           |

## AI image styles

With **AI Images** selected, a style menu appears: **Auto**, **Photorealistic**, **Illustration**, **Neon**, **Abstract**, **Black and White**, **3D**, **Line Art**. **Auto** picks a style that suits your chosen template.

AI images are deliberately generated **without text, faces, or charts** — this avoids garbled writing and uncanny people on your slides.

## Good to know

* **No repeats:** the same stock photo is never used twice within one presentation.
* **Files first:** when creating from a file, usable images from your document take priority over the selected source.
* **An empty image placeholder isn't an error.** If an image can't be retrieved during generation, the placeholder is left empty rather than failing the whole deck. Fill it afterwards with [Add Images](/edit-and-improve-slides/add-images).
* **Web Images** come from public web search — check usage rights before using them in published or commercial material. Stock images are licensed for free use.


# Review & Edit Before Inserting

After generation, Twistly shows every slide's content for review. **These are your real slides** — any edit you make here is exactly what appears in PowerPoint.

## What you can do

* **Edit all text** — titles and body content, with formatting: bold, italic, underline, strikethrough, and links all carry into the final deck. Titles are optional.
* **Reorder slides** by dragging. The cover slide stays first.
* **Add a slide** — appends an empty slide. At your plan's slide limit, the add button becomes an upgrade prompt instead.
* **Delete a slide** — hover over it and use the trash icon (the last remaining slide can't be deleted).
* **Edit tables** — click into a table for row and column controls. You can also **paste a table** from Excel, Word, or Google Sheets and it stays a real, editable PowerPoint table.

## Limitations

* **Charts and SmartArt are shown as read-only previews** — you can see them but not edit them here. Edit them in PowerPoint after inserting.
* There's no "insert table" button — tables come from generation or from pasting.
* Very wide or long pasted tables (over \~6 columns or 10 rows) may render with small text; nothing is cut, but consider splitting them.

{% hint style="warning" %}
**Going back discards your generated slides.** Navigating back from the review step to change the template or content cancels the generation — you'll need to generate again. Finish your review and insert first; you can always edit afterwards.
{% endhint %}


# Add a Slide

Add a single slide to your presentation — the new slide is inserted **right after the slide you currently have selected** (not at the end).

## Ways to fill the slide

* **AI-generated** *(paid plans)* — pick a template and layout (or **AI Decides**), describe what the slide should say, and the AI writes it. If your deck already has a few titled slides, Twistly suggests topic ideas based on them.
* **Attach a file** *(paid plans)* — base the slide on a document: `.pdf`, `.pptx`, `.docx`, `.txt`, or `.html`, up to **5 MB**.
* **Pre-designed samples** *(free)* — ready-made slides such as contacts, team, and thank-you, inserted instantly.
* **Blank layout** *(free)* — an empty slide in the chosen layout, no AI involved.

## Good to know

* AI slide generation requires a paid plan (Starter, Pro, or Team); blank and sample slides work on the Free plan.
* With a [custom template](/custom-templates-pro-and-team/using-and-managing-templates) (Pro & Team), the AI fills **exactly the layout you chose** — it won't switch to a different one.
* A slide must be selected in PowerPoint for insertion to work.
* The new slide is selected automatically after inserting, so you land right on it.


# Edit Text with AI

Rewrite the text on your slides in one click — directly in place, keeping your design untouched. Available on all paid plans.

## Actions

* Improve writing
* Fix spelling & grammar
* Make it shorter / Make it longer
* Make it more professional / Make it friendlier
* Simplify language
* Replace with bullet points
* Translate
* **Custom instructions** — describe any rewrite in your own words

## Scope

Apply the action to the **selected text**, the **current slide**, or **all slides**.

## Good to know

* **The AI only rewrites — it never adds or removes items.** Your slide structure, bullets count, and design stay as they are.
* **Language is preserved.** Text is rewritten in its original language unless you choose Translate.
* **"All slides" covers up to the first 35 slides** of a presentation. For longer decks, run it again on the remaining slides or work slide by slide.
* Editing all slides runs quietly in the background, slide by slide, and confirms when everything is done.
* If a rewrite makes text longer than its text box, Twistly automatically tries a tighter version — but very long rewrites can still overflow. "Make it shorter" is the quick fix.
* Want a conversational way to do this and more? Try the [Twistly Agent](/edit-and-improve-slides/twistly-agent).


# Twistly Agent (Chat)

The Twistly Agent is a chat panel inside the add-in. Ask in plain language — "make the titles punchier", "translate this slide to Spanish", "turn the second paragraph into bullets" — and it edits your slides for you.

## What it works on

Based on what you have selected: the **selected text or shapes**, the **current slide**, or the **whole presentation**. It handles regular text, bulleted and numbered lists, bold/italic/underline, hyperlinks, and table contents.

## How it behaves

* **Edits apply automatically.** When the agent proposes changes, they're written to your slides right away — a checkmark confirms it. Review the slide and use PowerPoint's undo if needed.
* **It's honest about its limits.** The agent edits *text*. Asked to change colors, fonts, positions, or delete shapes, it says it can't — and when another Twistly feature can do the job (redesign, add slide, add image, create presentation), it points you there with a shortcut.
* **It asks before big operations.** Editing a very large presentation in one go prompts a confirmation first.
* **Conversations are saved** and resume when you reopen the panel. After about 3 days of inactivity the thread starts fresh — use **New Conversation** to start fresh anytime.
* You can set the **language the agent replies in**, rate replies, and stop a response mid-way.

## Practical notes

* Messages can be up to 3,000 characters.
* If the agent says it changed nothing, it explains why (nothing matched, content couldn't be edited, or the text was already as requested).
* Available on every plan.


# Redesign Slides

Give existing slides a new look without rewriting your content. Available on all paid plans. There are two modes:

## Redesign the selected slide

Twistly analyzes the current slide and suggests **up to 6 layout options** as previews. Pick one and the slide is rebuilt in place.

* **Your images are kept** — the redesign reuses the slide's existing pictures rather than replacing them.
* Suggestions update automatically when you select a different slide.
* If a slide's content can't be fully read (for example, damaged embedded objects), Twistly redesigns what it can rather than failing.

## Redesign the entire presentation

Choose a template — built-in or one of your [custom templates](/custom-templates-pro-and-team/using-and-managing-templates) — and Twistly regenerates every slide onto it.

{% hint style="warning" %}
Whole-presentation redesign **replaces all existing slides** with the redesigned versions. Save a copy of your file first if you may want the original design back.
{% endhint %}

This mode runs like a full generation (it takes a few minutes and the result is inserted when ready).

## Redesigning an uploaded deck

You can also redesign a presentation you haven't opened: upload the `.pptx` in **Create from File** and choose **Redesign my presentation**. See [From Text or a File](/create-a-presentation/from-text-or-file).


# Speaker Notes

Generate talking points for your slides, written into PowerPoint's notes area. Available on all paid plans.

## Generate

* **Current slide** — notes for the selected slide. Twistly reads the neighboring slides too, so the notes flow naturally with your narrative (an opening slide gets an opener, a closing slide gets a wrap-up).
* **All slides** — notes for the whole presentation in one pass.

Notes are written in the **same language as the slide** — a Spanish deck gets Spanish notes.

## Rewrite existing notes

The **Rewrite** option adjusts notes you already have: improve the writing, **make them longer or shorter** (roughly ±30%), **translate** them, or apply your own custom instruction — for the selected slide or all slides.

## Good to know

* Generating for all slides on a long presentation can take a couple of minutes; you can cancel at any time.
* Generated notes **replace** what's in the notes field for those slides — if you have handwritten notes you want to keep, copy them out first or generate per-slide.
* For very large files (hundreds of megabytes of media), consider saving a copy before running all-slides generation.


# Add Images

Find or generate an image and place it on the selected slide. Clicking a result either fills the slide's image placeholder or adds the picture to the slide.

## Search images (free, all plans)

* **Stock** — professional stock photos, licensed for free use, with photographer attribution shown.
* **Web** — image search results from the web. Check usage rights before publishing.

Search by keyword, or browse the curated selection shown before you search. Results load continuously as you scroll.

## Generate AI images (paid plans)

Describe the image, then choose:

* **Orientation** — landscape, portrait, or square.
* **Style** — Auto, Photorealistic, Illustration, Neon, Abstract, Black and White, 3D, Line Art.

Twistly automatically refines your description behind the scenes — translating it, applying your chosen style, and matching your slide's color palette — so results can differ from a word-for-word reading of your prompt. Generated images intentionally contain **no text and no faces**.

Not happy with the result? **Regenerate** with the same prompt produces a new variation; tweaking the prompt steers it further.

## Good to know

* Select **exactly one slide** before inserting — insertion needs a clear target.
* Use **Crop** on a result to trim it before it lands on the slide.
* Insert AI images you want to keep — generated images aren't stored in your account, so a result you skip can't be retrieved later.


# Upload Your Template

Use your own company or personal PowerPoint design for everything Twistly generates. Available on **Pro** (1 template) and **Team** (5 templates) plans.

## Requirements

|               |                     |
| ------------- | ------------------- |
| File type     | `.pptx` or `.potx`  |
| File size     | up to **100 MB**    |
| Content       | at least 1 slide    |
| Template name | up to 20 characters |

## What makes a template work well

Twistly turns **each distinct slide design in your file into a reusable layout**, so the best source file is one slide per layout you actually use: a title slide, an agenda, one or two content layouts, a section divider, a closing slide. A few tips:

* **Real text boxes matter.** The AI fills your layouts' text boxes and respects their size — layouts with realistically sized text areas produce better slides than decorative ones.
* **Variety beats volume.** Ten distinct layouts serve better than fifty near-identical ones — near-duplicates are detected and skipped automatically anyway (you can override this).
* A finished presentation works fine as a source; you don't need a formal `.potx` template.

## After choosing a file

Twistly processes the file and shows the detected layouts — see [How Templates Are Processed](/custom-templates-pro-and-team/how-templates-are-processed) for what happens next and what the statuses mean.

{% hint style="info" %}
At your plan's template limit, the upload tile shows your count (e.g. 1/1) and is disabled — delete a template or upgrade to add another. Team templates are shared across the team.
{% endhint %}


# How Templates Are Processed

When you upload a template, Twistly analyzes it in stages. Knowing what happens when saves confusion:

## 1. Layout detection (immediate)

Your file is split into layouts — one per distinct slide design. **Near-duplicate layouts are automatically marked as skipped**; use the toggle on any layout to include or exclude it manually. At least one layout must stay included.

## 2. Preview thumbnails (a minute or two)

Previews render progressively — it's normal to see them appear one by one.

* **You can't save while previews are still rendering** — wait for them to finish and try again; your upload is kept.
* A **warning** on some layouts still lets you save; those layouts may render less accurately.
* An **error** means the file needs to be re-uploaded.
* **Templates with embedded fonts take noticeably longer** to preview — that's expected, not a hang.

## 3. AI layout descriptions (background, after saving)

After you save, the AI studies each layout and writes internal guidance on when to use it (this is how Twistly picks the right layout for each slide it generates). These fill in over the next few minutes — you can use the template right away; layout selection just gets smarter once they're done.

## If the upload fails

* "At least 1 slide is required" — the file contains no usable slides.
* File too large — the limit is **100 MB**.
* Processing unavailable — a temporary service issue; try again in a few minutes, and [contact us](/help/contact-us) if it persists.


# Using & Managing Templates

## Where your templates appear

Saved templates show up **first** — ahead of the built-in catalog — in:

* the template step when [creating a presentation](/create-a-presentation/templates),
* the template picker when [redesigning a whole presentation](/edit-and-improve-slides/redesign),
* the layout choice when [adding a single slide](/edit-and-improve-slides/add-a-slide).

When you add a single slide from a custom template, the AI fills **exactly the layout you picked** — it never substitutes a different one.

## Managing

Open a template to:

* **Rename** it (up to 20 characters).
* **Include or skip layouts** — skipped layouts are never used in generation.
* **Replace the file** — upload a new version of the deck; it goes through processing again.
* **Replace the preview image** (PNG or JPG).
* **Delete** — asks for confirmation. If the deleted template was selected anywhere, that selection reverts to a built-in template.

## Notes

* Template slots per plan: **Pro 1, Team 5**.
* On a Team plan, templates are available to all team members.
* Generated slides follow your template's layouts and styles, but the AI decides which layout fits each slide's content — if it keeps choosing a layout you dislike, skip that layout in the template settings.


# Plans & What's Included

Current prices are shown in the add-in on the **Plans** tab and at [twistly.ai](https://twistly.ai). All paid plans are available **monthly or yearly** — yearly saves 40%.

|                                                  | Free        | Starter     | Pro           | Team          |
| ------------------------------------------------ | ----------- | ----------- | ------------- | ------------- |
| Presentations                                    | 3 total     | Unlimited   | Unlimited     | Unlimited     |
| Max slides per presentation                      | 10          | 15          | 50            | 50            |
| Pasted text limit                                | 3,000 words | 7,000 words | 292,000 words | 292,000 words |
| Built-in templates (51)                          | ✓           | ✓           | ✓             | ✓             |
| Twistly Agent chat                               | ✓           | ✓           | ✓             | ✓             |
| Stock & web image search                         | ✓           | ✓           | ✓             | ✓             |
| AI slide generation (Add a Slide)                | —           | ✓           | ✓             | ✓             |
| Edit Text with AI                                | —           | ✓           | ✓             | ✓             |
| Redesign                                         | —           | ✓           | ✓             | ✓             |
| Speaker Notes                                    | —           | ✓           | ✓             | ✓             |
| AI image generation                              | —           | ✓           | ✓             | ✓             |
| Remove "made with" badge                         | —           | ✓           | ✓             | ✓             |
| Custom templates                                 | —           | —           | 1             | 5             |
| [API access](/plans-billing-and-team/api-access) | —           | —           | ✓             | ✓             |
| Team seats & central billing                     | —           | —           | —             | ✓             |

## Which plan?

* **Starter** — you mainly create and polish presentations up to 15 slides.
* **Pro** — you need longer decks, your own template, large-document input, or the API.
* **Team** — Pro for several people, on one bill, with shared templates. See [Manage Your Team](/plans-billing-and-team/manage-your-team).

Ready to purchase? See [Buy or Upgrade a Plan](/plans-billing-and-team/buy-or-upgrade).


# Buy or Upgrade a Plan

## Buying

1. Open the **Plans** tab in the add-in and pick a plan and billing period (monthly or yearly — yearly saves 40%).
2. **Sign in** if you haven't — a purchase must be attached to an account. Twistly asks automatically and continues to checkout afterwards.
3. Complete payment in the secure checkout (processed by Paddle, our payment provider). Prices are shown in your local currency where supported.

A receipt is emailed to you by Paddle after every charge.

{% hint style="info" %}
**Your plan can take a moment to activate.** Payment confirmation travels from the payment provider to Twistly, which usually takes seconds but occasionally longer. If your plan hasn't updated a couple of minutes after paying, close and reopen the add-in. Still not active? [Contact us](/help/contact-us) with the email you used at checkout — we'll sort it out.
{% endhint %}

## Upgrading

Upgrade anytime from the Plans tab (for example Starter → Pro). You'll see a confirmation first, and the price difference is **prorated** — you only pay for the remainder of the current billing period at the new rate.

* On a Team plan, **only the team owner** can change the plan or buy seats.
* **Downgrading** to a cheaper plan isn't available in the add-in — [contact us](/help/contact-us) and we'll help.

## Managing billing

Cancel or pause anytime — see [Cancel or Pause a Subscription](/plans-billing-and-team/cancel-or-pause). You can also manage your subscription without the add-in at [twistly.ai/manage-subscription](https://twistly.ai/manage-subscription/).


# Cancel or Pause a Subscription

You can cancel in two ways — no questions asked:

* **In the add-in:** Plans tab → your current plan → **Edit Plan** → **Cancel Subscription**.
* **Without the add-in:** [twistly.ai/manage-subscription](https://twistly.ai/manage-subscription/) — works even if you've already uninstalled.

## What happens when you cancel

* Cancellation takes effect at the **end of your current billing period** — you keep full access to everything you've paid for until then. No further charges after that.
* Your account then moves to the Free plan. Your presentations are unaffected — they're your PowerPoint files.
* Cancelling a **Team** subscription ends access for **all team members** at the period end.
* You can resubscribe anytime from the Plans tab.

## Pause instead (Starter & Pro)

If you don't need Twistly for a while, you can **pause for 3 months** instead of cancelling: billing stops, and your subscription resumes automatically afterwards. Pausing starts from your next billing date, so the time you've paid for isn't lost.

## Refunds

See our [fulfillment & refund policy](https://twistly.ai/fulfillment-policy). For refund requests, [contact us](/help/contact-us) with the email you used at checkout.

Don't want to lose paid time? Instead of cancelling, we can **transfer the remaining subscription term to a different email address** (a colleague, another account of yours) — [contact us](/help/contact-us).

## Plan unexpectedly shows Cancelled?

If your plan shows as cancelled even though you didn't cancel, the most common cause is a **failed renewal payment** — when a charge doesn't go through, the subscription is cancelled automatically. [Contact us](/help/contact-us) and we'll reactivate it.

{% hint style="warning" %}
[Uninstalling the add-in](/getting-started/uninstall) does **not** cancel your subscription — cancel here first.
{% endhint %}


# Manage Your Team

On a **Team** plan, the person who purchased the subscription is the **team owner** and manages members from the Plans tab. Only the owner can add or remove members, change the plan, or buy seats.

## Seats

A team starts with **2 seats**, and **the owner occupies one of them**. Need more? **Buy additional seats** from the same screen — like plan changes, new seats can take a moment to appear after payment.

## Adding a member

Enter the person's email address. Points worth knowing **before** you add someone:

* **No invitation email is sent.** The person is added immediately — tell them yourself to sign in to Twistly with that exact email (Microsoft, Google, or email sign-in). See [Sign In & Your Account](/getting-started/sign-in-and-account).
* **They don't need a Twistly account yet.** An account is prepared for them; it activates when they first sign in with that email.
* **Their personal paid subscription, if they have one, is cancelled automatically** when they join your team — they won't be double-billed, but let them know in advance.
* Someone already on **another team** can't be added until they leave it.

## Removing a member

Click the remove icon next to the member. **This takes effect immediately, without a confirmation step** — the person drops to the Free plan right away. The owner can't remove themselves.

## Team resources

* All members get full Pro-level features (50 slides, all AI tools).
* [Custom templates](/custom-templates-pro-and-team/upload-a-template) (up to 5) are shared across the team.
* Billing is centralized — one invoice for the whole team, paid by the owner.


# API Access

Pro and Team plans include access to the **Twistly Presentation API** — generate presentations from a topic, text, or file programmatically, outside PowerPoint. Full technical documentation: [Presentation API](/api-reference/presentations).

## Getting your API key

1. Open **Settings → API key** in the add-in (Pro/Team only).
2. Click **Create key** and **copy it immediately**.

{% hint style="warning" %}
**Your key is shown only once.** Twistly stores it in a form that can't be read back — if you lose it, no one can recover it, including us. Delete the old key and create a new one instead.
{% endhint %}

## Key facts

* Keys start with `ppsk_`. Keep yours secret — anyone holding it can generate presentations on your account.
* **One active key per account.** To rotate, delete the existing key first, then create a new one. Deleting stops the old key working immediately.
* The panel shows your key's prefix, creation date, and **when it was last used** — useful for checking whether an integration is alive.

## Usage limits

* **100 presentation generations per 24 hours.** Failed generations don't count.
* Request rates: 60 generation requests and 600 status checks per minute.
* API limits are separate from the add-in — using the API doesn't consume anything in the add-in, and an API key doesn't change your in-app plan limits.

The API accepts `.pdf`, `.docx`, `.pptx`, and `.txt` files. For request formats, status polling, and examples, see the [Presentation API](/api-reference/presentations) — and the [Twistly MCP Server](/api-reference/twistly-mcp-server) for AI-assistant integrations.


# Troubleshooting

## Installation & opening

**The add-in isn't in the ribbon / won't open.** Restart PowerPoint. If it's still missing, update Office (File → Account → Update Now) and check you're signed in to PowerPoint with the account you installed under. On work or school accounts, your Microsoft 365 admin may need to approve the add-in — see [Install & Open](/getting-started/install-and-open).

**Your organization blocks the add-in.** Some company or school networks and IT policies block Office add-ins entirely. Ask your IT department to approve Twistly (GPT for PowerPoint) — and in the meantime you can use the web version at [app.twistly.ai](https://app.twistly.ai/), which needs no installation.

**Blank panel.** Close and reopen the add-in. On PowerPoint for the web, refresh the browser tab.

## Sign-in

**The sign-in popup doesn't appear.** A popup blocker is the usual cause — allow popups for PowerPoint/your browser and try again. (Applies to Microsoft and Google sign-in; email sign-in doesn't use a popup.)

**The email sign-in code doesn't arrive.** Codes can take a few minutes — check the Spam and Promotions folders. Each code works once and expires after a short time; use **Resend code** to get a new one.

**Twistly keeps asking me to sign in.** This happens when several Twistly accounts have been used on the same device. Sign in with the account that holds your plan. See [Sign In & Your Account](/getting-started/sign-in-and-account).

## Creating presentations

**Generation is taking a long time.** A few minutes is normal, especially for large files and long decks. The progress bar is an estimate — generation may finish before or after it fills. You can cancel safely at any time; cancelled generations aren't charged.

**Generation failed.** Try again — temporary hiccups happen and retries are free on failure. For file uploads, check the format and size ([supported types](/create-a-presentation/from-text-or-file)). If one file repeatedly fails, try re-saving it (e.g. re-export the PDF) — and [send it to us](/help/contact-us) so we can investigate.

**The deck looks generic or half-empty.** Occasionally a generation completes with weaker content than it should. Simply generate again — a fresh run usually fixes it. If you're on the Free plan and this cost you credits, [contact us](/help/contact-us).

**Some image placeholders are empty.** An image couldn't be retrieved during generation — this doesn't fail the deck. Fill the gaps with [Add Images](/edit-and-improve-slides/add-images).

**I got more slides than I asked for.** That's by design when content would otherwise overflow — see [Number of Slides](/create-a-presentation/number-of-slides).

**My slides came out in the wrong language.** When creating from text or a file, the output follows the **source document's** language. Translate afterwards with [Edit Text with AI](/edit-and-improve-slides/edit-text-with-ai).

## Editing existing slides

**Edit, redesign, or speaker notes do nothing on my file.** Check for the yellow **Protected View / "Enable Editing"** banner at the top of PowerPoint — while the file is read-only, AI edits silently fail. Click **Enable Editing** and try again.

**A slide won't process.** Slides with no text (blank or image-only slides) can't be used by text-based AI features — add some text content first, or use [Add Images](/edit-and-improve-slides/add-images) / [Add a Slide](/edit-and-improve-slides/add-a-slide) instead.

## Billing

**I paid but my plan isn't active.** Activation usually takes seconds but can lag a couple of minutes. Close and reopen the add-in. If it's still not active, [contact us](/help/contact-us) with the email used at checkout — the payment is safe and we'll apply it.

**A feature says I need to upgrade, or shows a trial, even though I subscribed.** Sign in **inside the add-in** with the exact email you used at purchase — the add-in doesn't pick up your plan from the account PowerPoint itself is signed into. This is by far the most common cause; see [Sign In & Your Account](/getting-started/sign-in-and-account).

**My plan shows Cancelled but I didn't cancel.** The renewal payment probably failed — a failed charge cancels the plan automatically. [Contact us](/help/contact-us) and we'll reactivate it.

## Custom templates

**Upload rejected as too large.** The limit for templates is **100 MB** (smaller than the 300 MB create-from-file limit). Compressing images in PowerPoint (Picture Format → Compress Pictures) usually gets files under it.

**"Preview images are still being generated."** Wait for the thumbnails to finish, then save again — your upload is preserved. Templates with embedded fonts take longer than usual. See [How Templates Are Processed](/custom-templates-pro-and-team/how-templates-are-processed).

## Still stuck?

[Contact us](/help/contact-us) — include what you were doing, the approximate time, and your account email.


# FAQ

## General

**Which versions of PowerPoint work with Twistly?** PowerPoint for Windows, Mac, and the web, on a reasonably current Office version. If the add-in store shows Twistly, your PowerPoint can run it.

**Does Twistly work offline?** No — generation happens in the cloud, so an internet connection is required.

**Can I use Twistly from ChatGPT or another AI assistant?** Yes — connect the [Twistly MCP Server](/api-reference/twistly-mcp-server) in any MCP-compatible client and ask for a deck in plain language. You get back a downloadable PowerPoint or PDF, billed to the same Twistly account you use in the add-in.

**Is Twistly the same as "GPT for PowerPoint"?** Yes — **GPT for PowerPoint** is the add-in's name on the Microsoft AppSource marketplace; Twistly is the product name. Same add-in, same account.

**Does my ChatGPT Plus or Microsoft Copilot subscription include Twistly?** No. Twistly is a standalone product and is **not affiliated with OpenAI or Microsoft Copilot** — a ChatGPT or Copilot subscription can't be used to sign in, and a Twistly plan is purchased separately. See [Plans & What's Included](/plans-billing-and-team/plans).

**Which languages are supported?** Presentations can be generated in 38 languages, including all major European and Asian languages. When creating from text or a file, output follows the source's language automatically.

## Creating & editing

**Can I undo what Twistly did?** Twistly edits your open presentation like you would, so PowerPoint's undo (Ctrl+Z / Cmd+Z) works for most operations. Before large operations — whole-presentation redesign, all-slides speaker notes — saving a copy of the file is the safest habit.

**Where are my presentations stored?** In your PowerPoint file, wherever you save it. Uninstalling Twistly or cancelling a plan never touches your presentations.

**Can I use the generated images commercially?** Stock images are licensed for free use (attribution shown in the add-in). AI-generated images are created for your presentation. **Web** image results come from public web search — verify rights yourself before commercial use.

**Why do slides sometimes exceed my chosen slide count?** Overcrowded slides are split rather than truncated — see [Number of Slides](/create-a-presentation/number-of-slides).

## Account & billing

**Do I need an account to try Twistly?** No — your 3 free presentations work before signing in. Sign in (Microsoft, Google, or email) to keep your plan across devices; purchases require sign-in.

**How do I remove the "made with" badge?** The badge is removed on all paid plans.

**What does the charge look like on my bank statement?** Charges appear as **PADDLE.NET\* TWISTLY** (Paddle is our payment provider); older subscriptions may show as **TWISTLY** or **Twistly.ai**. If you don't recognize a charge, [contact us](/help/contact-us) with the amount and date and we'll identify it.

**How do I get an invoice?** Paddle emails a receipt to your subscription email after every charge. For a copy, a different billing email, or automatic monthly invoices for your accounting team, [contact us](/help/contact-us).

**Does uninstalling cancel my subscription?** No. Cancel from the Plans tab or at [twistly.ai/manage-subscription](https://twistly.ai/manage-subscription/) — see [Cancel or Pause](/plans-billing-and-team/cancel-or-pause).

**What's your refund policy?** See the [fulfillment & refund policy](https://twistly.ai/fulfillment-policy), or [contact us](/help/contact-us).

**Can my whole company use one subscription?** That's the Team plan — shared templates, central billing, per-seat members. See [Manage Your Team](/plans-billing-and-team/manage-your-team).


# Contact Us

* **Email:** <support@twistly.ai>
* **In the add-in:** the **Contact us** option opens a support chat.
* **Web:** [twistly.ai/contact](https://twistly.ai/contact)

We're a small team and answer every message — usually within one to two business days.

## Help us help you faster

Include in your message:

* The **email address** of your Twistly account (especially for billing questions — use the email from checkout).
* **What you were doing** when the problem occurred, and roughly when.
* For file-related issues, **attach the file** if you can — most upload problems can only be diagnosed with the actual file.

For quick answers, check [Troubleshooting](/help/troubleshooting) and the [FAQ](/help/faq) first.


# Presentation API

Generate professional presentations from a topic, raw text, or a source document (PDF / PPTX / DOCX / TXT) — programmatically, outside PowerPoint. Output is a downloadable PPTX or PDF.

|                  |                                                                                             |
| ---------------- | ------------------------------------------------------------------------------------------- |
| **Base URL**     | `https://api.appsdowonders.com`                                                             |
| **Availability** | Pro and Team plans — see [API Access](/plans-billing-and-team/api-access) for getting a key |
| **Style**        | Asynchronous: submit a job, poll for the result                                             |

The API inherits the add-in's generation pipeline — the same [templates](/create-a-presentation/templates), [image sources and styles](/create-a-presentation/images), and quality.

{% hint style="info" %}
Building an AI-assistant integration instead of a code integration? See the [Twistly MCP Server](/api-reference/twistly-mcp-server) — same pipeline, no API key.
{% endhint %}

## Authentication

Every request must carry your API key (starts with `ppsk_`), one of two ways:

| Method                        | Header                         | Notes                                        |
| ----------------------------- | ------------------------------ | -------------------------------------------- |
| Bearer auth (**recommended**) | `Authorization: Bearer ppsk_…` |                                              |
| API-key header                | `x-api-key: ppsk_…`            | For platforms that can't set a Bearer header |

Keys are issued in the add-in (**Settings → API key**, Pro/Team) — see [API Access](/plans-billing-and-team/api-access). **One active key per account**: to rotate, revoke the old key first, then create a new one.

## Asynchronous flow

Every `POST` endpoint queues a generation job and returns `202 Accepted` with a job descriptor. Poll `GET /v1/presentations/{id}` (recommended cadence: **every 2–3 seconds**) until `status` becomes `completed` — download URL in `result.url` — or `failed`, with the reason in `error`.

* Typical generation time is **30–90 seconds**; the hard cap is **5 minutes** per job, after which jobs are marked `failed` with code `TIMEOUT`.
* Download links are **permanent**.
* Jobs are **owner-scoped** — visible only to the API key that created them.
* Job `status` is one of `queued`, `processing`, `completed`, `failed`.

```bash
# 1. Submit a job
curl -s -X POST https://api.appsdowonders.com/v1/presentations/topic \
  -H "Authorization: Bearer ppsk_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "topic": "Renewable Energy", "numSlides": 10 }'
# → 202 { "id": "9f1c…", "status": "queued", "createdAt": "…" }

# 2. Poll until completed (every 2–3 s)
curl -s https://api.appsdowonders.com/v1/presentations/9f1c2a4e-6e2c-4f8a-9b3d-1a2b3c4d5e6f \
  -H "Authorization: Bearer ppsk_YOUR_KEY"
# → 200 { "status": "completed", "result": { "url": "https://…/renewable-energy-9f1c2a4e.pptx" } }
```

## Rate limits

Two separate buckets per API key:

| Bucket         | Limit                 | Applies to                               |
| -------------- | --------------------- | ---------------------------------------- |
| `public-write` | **3 requests/min**    | All `POST /v1/presentations/*` endpoints |
| `public-read`  | **1200 requests/min** | `GET /v1/presentations/{id}`             |

Every response includes `x-ratelimit-limit`, `x-ratelimit-remaining`, and `x-ratelimit-reset` (milliseconds until the window resets). Exceeding a bucket returns `429 RATE_LIMIT_EXCEEDED`. The read limit comfortably supports the 2–3 s polling cadence, even across many concurrent jobs.

## Shared parameters

These fields are accepted by all creation endpoints (see each endpoint for which apply):

| Field         | Values                                                                                                        | Default    | Notes                                                                                                                                                                                                                                                                                                                                                                                      |
| ------------- | ------------------------------------------------------------------------------------------------------------- | ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `numSlides`   | `-1` (auto) or `1`–`50`                                                                                       | `-1`       | `0` is invalid. Auto lets the AI fit the count to the content — see [Number of Slides](/create-a-presentation/number-of-slides)                                                                                                                                                                                                                                                            |
| `template`    | Template id                                                                                                   | `Tokyo`    | Case-sensitive, no spaces: the template name with spaces removed (**New York** → `NewYork`). All **51 built-in templates** are available — see [Templates](/create-a-presentation/templates) for the gallery and the [full id list](/api-reference/twistly-mcp-server#templates). Custom uploaded templates are **not** available — jobs referencing them fail with `UNSUPPORTED_TEMPLATE` |
| `format`      | `pptx` \| `pdf`                                                                                               | `pptx`     | Output file format                                                                                                                                                                                                                                                                                                                                                                         |
| `imageSource` | `unsplash` \| `pexels` \| `scrapingdog` \| `ai` \| `flux`                                                     | `unsplash` | `unsplash`/`pexels` are stock, `scrapingdog` is web search, `ai`/`flux` are AI-generated — see [Images in Your Presentation](/create-a-presentation/images)                                                                                                                                                                                                                                |
| `imageStyle`  | `auto` \| `photorealistic` \| `illustration` \| `neon` \| `abstract` \| `black-and-white` \| `3d` \| `linear` | —          | Only when `imageSource` is `ai` or `flux` — the same styles as the add-in's [AI image styles](/create-a-presentation/images#ai-image-styles)                                                                                                                                                                                                                                               |

## POST /v1/presentations/topic

Create a presentation from a topic — you have a topic or idea, the AI writes the content.

**Body** (`application/json`) — shared parameters above, plus:

| Field              | Type                                                                             | Required | Default     | Notes                                    |
| ------------------ | -------------------------------------------------------------------------------- | -------- | ----------- | ---------------------------------------- |
| `topic`            | string                                                                           | **Yes**  | —           | Subject of the presentation, ≤ 450 chars |
| `language`         | string                                                                           | No       | auto-detect | Output language                          |
| `content`          | `short` \| `detailed` \| `bulletPoints`                                          | No       | `detailed`  | Text verbosity                           |
| `presentationType` | `General` \| `Educational Project` \| `Business Pitch` \| `Reports and Insights` | No       | —           |                                          |
| `targetAudience`   | string                                                                           | No       | —           | Free text, ≤ 200 chars                   |
| `toneAndStyle`     | string                                                                           | No       | —           | Free text, ≤ 200 chars                   |

**Examples:**

```json
{ "topic": "Renewable Energy" }
```

```json
{
  "topic": "История кофе",
  "language": "russian",
  "numSlides": 12,
  "template": "Berlin"
}
```

```json
{
  "topic": "Digital Marketing Strategy",
  "numSlides": 5,
  "template": "Berlin",
  "imageSource": "flux",
  "imageStyle": "illustration",
  "content": "bulletPoints",
  "presentationType": "Business Pitch",
  "targetAudience": "Marketing managers",
  "toneAndStyle": "Enthusiastic"
}
```

## POST /v1/presentations/text

Create a presentation from raw text. **The output language always matches the source language.**

**Body** (`application/json`) — shared parameters above, plus:

| Field                | Type                                    | Required | Default   | Notes                                                                                    |
| -------------------- | --------------------------------------- | -------- | --------- | ---------------------------------------------------------------------------------------- |
| `text`               | string                                  | **Yes**  | —         | Source text, max **665,000 tokens** (≈ 500,000 words)                                    |
| `contentModificator` | `preserve` \| `expand` \| `condense`    | No       | `expand`  | How the source content is treated: keep as-is, add detail, or tighten into key takeaways |
| `textDensity`        | `minimal` \| `concise` \| `detailed`    | No       | `concise` | Density of text on each slide                                                            |
| `verbosity`          | `short` \| `detailed` \| `bulletPoints` | No       | —         | Text verbosity                                                                           |

If the text exceeds the token limit, the API responds `400 BAD_REQUEST` with `tokensCount` and `tokenLimit` in the error body.

**Example** — text to a 10-slide PDF:

```json
{
  "text": "Coffee was first discovered in the Ethiopian highlands...",
  "numSlides": 10,
  "template": "Rome",
  "format": "pdf"
}
```

## POST /v1/presentations/file

Create a presentation from a document. Upload a PDF, PPTX, DOCX, or TXT (**max 300 MB**). File types are validated by magic-byte sniffing — extension spoofing is rejected. **The output language always matches the source language.**

**Body** (`multipart/form-data`) — every non-file field arrives as a string (`numSlides` as `"15"`); the API coerces them. Shared parameters above, plus:

| Field                | Type   | Required | Notes                                                                  |
| -------------------- | ------ | -------- | ---------------------------------------------------------------------- |
| `file`               | binary | **Yes**  | PDF (`application/pdf`), PPTX, DOCX, or TXT (`text/plain`), max 300 MB |
| `contentModificator` | string | No       | `preserve` \| `expand` \| `condense` (default `expand`)                |
| `textDensity`        | string | No       | `minimal` \| `concise` \| `detailed` (default `concise`)               |
| `verbosity`          | string | No       | `short` \| `detailed` \| `bulletPoints`                                |

**Example:**

```bash
curl -s -X POST https://api.appsdowonders.com/v1/presentations/file \
  -H "Authorization: Bearer ppsk_YOUR_KEY" \
  -F "file=@quarterly-report.pdf" \
  -F "numSlides=15" \
  -F "template=Berlin"
```

## GET /v1/presentations/{id}

Get job status and result. Once `status` is `completed`, fetch the permanent download URL from `result.url`.

| Parameter | In   | Type | Notes                                                    |
| --------- | ---- | ---- | -------------------------------------------------------- |
| `id`      | path | UUID | Job id returned by a `POST /v1/presentations/*` endpoint |

**Job object:**

| Field                         | Type                                                | Present                                                    |
| ----------------------------- | --------------------------------------------------- | ---------------------------------------------------------- |
| `id`                          | UUID                                                | always                                                     |
| `status`                      | `queued` \| `processing` \| `completed` \| `failed` | always                                                     |
| `createdAt`                   | ISO-8601                                            | always                                                     |
| `completedAt`                 | ISO-8601                                            | when `status` is `completed` or `failed`                   |
| `result.url`                  | URL                                                 | when `completed` — permanent download URL for the PPTX/PDF |
| `error.code`, `error.message` | see below                                           | when `failed`                                              |

**Response examples:**

```json
{
  "id": "9f1c2a4e-6e2c-4f8a-9b3d-1a2b3c4d5e6f",
  "status": "completed",
  "createdAt": "2026-06-03T10:15:00.000Z",
  "completedAt": "2026-06-03T10:15:42.000Z",
  "result": {
    "url": "https://s3.amazonaws.com/.../the-history-of-coffee-9f1c2a4e.pptx"
  }
}
```

```json
{
  "id": "9f1c2a4e-6e2c-4f8a-9b3d-1a2b3c4d5e6f",
  "status": "failed",
  "createdAt": "2026-06-03T10:15:00.000Z",
  "completedAt": "2026-06-03T10:20:00.000Z",
  "error": {
    "code": "UPSTREAM_FAILURE",
    "message": "human-readable reason"
  }
}
```

Returns `404 NOT_FOUND` for unknown ids (or jobs belonging to another key).

**Job failure codes** (`error.code` on a failed job):

| Code                   | Meaning                                                               |
| ---------------------- | --------------------------------------------------------------------- |
| `TIMEOUT`              | Generation exceeded the soft timeout                                  |
| `WORKER_TIMEOUT`       | Worker aborted the job (default 5 min)                                |
| `UPSTREAM_FAILURE`     | Underlying AI/build pipeline failed — retry                           |
| `UNSUPPORTED_TEMPLATE` | Custom (user-uploaded) templates are not supported via the public API |
| `INPUT_TOO_LARGE`      | Source content exceeded internal processing limits                    |

## GET /v1/me

Lightweight key-validation endpoint. Returns the account associated with the API key — useful as an authentication test (e.g., for Zapier or other integration platforms) and for checking remaining credits.

```bash
curl -s https://api.appsdowonders.com/v1/me \
  -H "Authorization: Bearer ppsk_YOUR_KEY"
```

**Response** `200`:

```json
{
  "userId": 1,
  "email": "user@example.com",
  "plan": "pro",
  "credits": {
    "remaining": 100
  }
}
```

`credits.remaining` is `null` for internal/unlimited keys. Returns `401 UNAUTHORIZED` if the key is missing or invalid.

## HTTP errors

All `4xx`/`5xx` responses use a uniform envelope:

```json
{
  "error": {
    "code": "BAD_REQUEST",
    "message": "Human-readable message. For invalid enum fields, lists the allowed values.",
    "status": 400
  }
}
```

| HTTP status | `error.code`                                                                                    |
| ----------- | ----------------------------------------------------------------------------------------------- |
| 400         | `BAD_REQUEST` — validation failed (for oversized text, includes `tokensCount` and `tokenLimit`) |
| 401         | `UNAUTHORIZED` — missing or invalid API key                                                     |
| 403         | `FORBIDDEN` — the account's plan doesn't include API access                                     |
| 404         | `NOT_FOUND` — unknown job id (or a job owned by another key)                                    |
| 422         | `UNPROCESSABLE_ENTITY` — input can't be processed                                               |
| 429         | `RATE_LIMIT_EXCEEDED` — see [Rate limits](#rate-limits)                                         |
| 500         | `INTERNAL_SERVER_ERROR`                                                                         |


# Twistly MCP Server

Connect any compatible MCP client to Twistly, then simply ask for a deck — "make me a 12-slide presentation about renewable energy" — and get back a downloadable PowerPoint or PDF.

Server URL: `https://mcp.twistly.ai/mcp`

## How MCP differs from the REST API

Both interfaces use the same generation pipeline. What changes is who calls it and how the caller is identified — MCP is designed for interactive AI clients.

* **No API key.** Users sign in with their normal Twistly account (Google, Microsoft, or an emailed code). Nothing to issue, paste, or rotate.
* **No Twistly account needed up front.** If the email that signed in has no Twistly account yet, a Free one is created automatically on the first generation.
* **The AI client calls the tools, not your code.** The client's model reads the tool schemas and decides when to call which tool from what the user says.
* **Four tools instead of four endpoints:** `create_from_topic`, `create_from_text`, `create_from_file`, `get_job_status`.
* **Asynchronous, same as the REST API.** A `create_*` tool returns a `job_id`; `get_job_status` returns the download link.
* **Default image source is `flux`** (AI-generated), where the REST API defaults to `unsplash`. The REST API's `ai` value doesn't exist here — `flux` replaces it.
* **Billed by account, not by key** — see [Plans and billing](#plans-and-billing).

Use the REST API when integrating from code. Use MCP when users need Twistly inside an AI client.

## Get started

### What you need

* An email address the user can sign in with — Google, Microsoft, or any inbox that can receive a code. A Twistly account is **not** a prerequisite: a Free one is created automatically on the first generation.
* An MCP client that supports **Streamable HTTP** and **OAuth**.
* The server URL: `https://mcp.twistly.ai/mcp`.

### Your first presentation

**Step 1 — Connect Twistly.** Add Twistly using the server URL in your MCP client's connector settings. The client opens the Twistly sign-in page: continue with **Google**, **Microsoft**, or **email** (a 6-digit code arrives by email). Access is granted automatically and the page closes itself after a 5-second countdown.

**Step 2 — Ask for a deck.** In natural language:

```
Make a presentation about the history of coffee — 12 slides, Berlin template
```

The client calls `create_from_topic` and receives a queued job:

```json
{
  "job_id": "9f1c2a4e-6e2c-4f8a-9b3d-1a2b3c4d5e6f",
  "status": "queued",
  "created_at": "2026-07-30T10:15:00.000Z"
}
```

**Step 3 — Get the file.** The client checks the job until generation completes, then shows a permanent download link from `result.url`. Generation usually takes **30–90 seconds**, with status updates while it runs.

### Use with ChatGPT

ChatGPT is one supported MCP client. Add a connector with the server URL above — or, when Twistly appears in the ChatGPT app directory, select it there and choose **Connect**.

## Authentication

Twistly uses OAuth — neither the user nor the MCP client ever handles an API key.

|                         |                                                                                                                    |
| ----------------------- | ------------------------------------------------------------------------------------------------------------------ |
| **Sign-in methods**     | Google, Microsoft, email code (6 digits)                                                                           |
| **Permissions granted** | `presentations:create` — create presentations. `presentations:read` — read the status of presentations it created  |
| **Session length**      | 7 days, then sign-in again                                                                                         |
| **Account binding**     | The connection is bound to the account that signed in. Switching accounts means reconnecting                       |
| **New accounts**        | An email with no Twistly account gets a Free one created automatically — on the first *generation*, not at sign-in |

Everything is billed to the email the user signed in with, so MCP generations draw on the **same plan and balance** as that person's generations in the add-in or on the web. Signing in with an email that already has a Twistly account picks up that account — plan, balance, and history included.

When a session expires or a permission is missing, the client receives an authorization challenge instead of an error and prompts the user to reconnect.

## The tools

| Tool                | Use when                                                  | Permission             |
| ------------------- | --------------------------------------------------------- | ---------------------- |
| `create_from_topic` | The user has a topic or idea — the AI writes the content  | `presentations:create` |
| `create_from_text`  | The user already has text and wants it turned into slides | `presentations:create` |
| `create_from_file`  | The user has a PDF / PPTX / DOCX / TXT to convert         | `presentations:create` |
| `get_job_status`    | Check status, fetch the download URL                      | `presentations:read`   |

Every `create_*` tool replies immediately with `{ job_id, status: "queued", created_at }`. The file URL is delivered by `get_job_status` once `status` becomes `completed`.

`get_job_status` also accepts `wait: true`, which polls internally for up to **25 seconds** (2s → 5s backoff) before answering. If the job hasn't finished by then it returns `processing` with an explicit "call again in a few seconds" message. Status is one of `queued`, `processing`, `completed`, `failed`.

### 1. `create_from_topic`

Generates a presentation from a short topic prompt.

| Field               | What it does                                                                                                                                                 | Required | Default     |
| ------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------- | ----------- |
| `topic`             | Subject of the presentation (1–450 chars)                                                                                                                    | Yes      | —           |
| `num_slides`        | Slide count (`-1` for auto, or `1`–`50`; `0` is invalid)                                                                                                     | No       | auto        |
| `language`          | Output language                                                                                                                                              | No       | auto-detect |
| `template`          | Design theme (see [Templates](#templates))                                                                                                                   | No       | `Tokyo`     |
| `format`            | `pptx` \| `pdf`                                                                                                                                              | No       | `pptx`      |
| `image_source`      | `unsplash` \| `pexels` \| `scrapingdog` \| `flux`                                                                                                            | No       | `flux`      |
| `image_style`       | `auto` \| `photorealistic` \| `illustration` \| `neon` \| `abstract` \| `black-and-white` \| `3d` \| `linear` *(applies only when `image_source` is `flux`)* | No       | —           |
| `content`           | Text verbosity: `short` \| `detailed` \| `bulletPoints`                                                                                                      | No       | `detailed`  |
| `presentation_type` | `General` \| `Educational Project` \| `Business Pitch` \| `Reports and Insights`                                                                             | No       | —           |
| `target_audience`   | Free text, ≤ 200 chars                                                                                                                                       | No       | —           |
| `tone_and_style`    | Free text, ≤ 200 chars                                                                                                                                       | No       | —           |

Example — the user asks for "a 5-slide illustrated digital-marketing pitch for marketing managers with upbeat bullet points", and the client sends:

```json
{
  "topic": "Digital Marketing Strategy",
  "num_slides": 5,
  "image_source": "flux",
  "image_style": "illustration",
  "content": "bulletPoints",
  "presentation_type": "Business Pitch",
  "target_audience": "Marketing managers",
  "tone_and_style": "Enthusiastic"
}
```

### 2. `create_from_text`

Turns text the user supplies in the MCP client into slides.

| Field                 | What it does                                        | Required | Default     |
| --------------------- | --------------------------------------------------- | -------- | ----------- |
| `text`                | Source text (1–2,000,000 chars at this layer)       | Yes      | —           |
| `num_slides`          | Slide count (`-1` for auto, or `1`–`50`)            | No       | auto        |
| `language`            | Output language                                     | No       | auto-detect |
| `template`            | Design theme                                        | No       | `Tokyo`     |
| `format`              | `pptx` \| `pdf`                                     | No       | `pptx`      |
| `content_modificator` | `preserve` \| `expand` \| `condense`                | No       | `expand`    |
| `text_density`        | `minimal` \| `concise` \| `detailed`                | No       | `concise`   |
| `verbosity`           | `short` \| `detailed` \| `bulletPoints`             | No       | —           |
| `image_source`        | `unsplash` \| `pexels` \| `scrapingdog` \| `flux`   | No       | `flux`      |
| `image_style`         | See `image_style` values above *(only with `flux`)* | No       | —           |

The 2,000,000-character ceiling is only this layer's input guard. The real limit is the backend's **665,000-token** budget (≈ 500,000 words) — longer input returns `input_too_large`.

### 3. `create_from_file`

Converts an uploaded document into slides. The file arrives one of three ways, and **exactly one** must be used.

| Field                 | What it does                                                                                                                                                                                                  | Required     | Default     |
| --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------ | ----------- |
| `file`                | **Preferred.** The file the user attached in the MCP client. The client passes a reference (`download_url`, `file_id`, `mime_type`, `file_name`) and the server fetches the bytes itself, so large files work | one of three | —           |
| `file_base64`         | Inline bytes for small files. Requires `mime_type`                                                                                                                                                            | one of three | —           |
| `file_url`            | An `https` URL the server downloads. Requires `mime_type`                                                                                                                                                     | one of three | —           |
| `filename`            | Name to use for the upload, ≤ 255 chars                                                                                                                                                                       | No           | derived     |
| `mime_type`           | Declared type — required with `file_base64` / `file_url`                                                                                                                                                      | conditional  | —           |
| `num_slides`          | Slide count (`-1`, or `1`–`50`)                                                                                                                                                                               | No           | auto        |
| `language`            | Output language                                                                                                                                                                                               | No           | auto-detect |
| `template`            | Design theme                                                                                                                                                                                                  | No           | `Tokyo`     |
| `format`              | `pptx` \| `pdf`                                                                                                                                                                                               | No           | `pptx`      |
| `content_modificator` | `preserve` \| `expand` \| `condense`                                                                                                                                                                          | No           | `expand`    |
| `text_density`        | `minimal` \| `concise` \| `detailed`                                                                                                                                                                          | No           | `concise`   |
| `verbosity`           | `short` \| `detailed` \| `bulletPoints`                                                                                                                                                                       | No           | —           |
| `image_source`        | as above                                                                                                                                                                                                      | No           | `flux`      |
| `image_style`         | as above                                                                                                                                                                                                      | No           | —           |

**Accepted file types** (validated by content, not just extension — extension spoofing is rejected):

* PDF (`application/pdf`)
* PowerPoint (`application/vnd.openxmlformats-officedocument.presentationml.presentation`)
* Word (`application/vnd.openxmlformats-officedocument.wordprocessingml.document`)
* Plain text (`text/plain`)

With `file_base64` or `file_url`, the detected type must match the declared `mime_type` — otherwise the call fails with `unsupported_file_type`.

{% hint style="info" %}
**Attach files through the MCP client whenever possible.** Attachments and URL files support up to **100 MB** because the server downloads them directly; inline base64 is limited to **25 MB**.
{% endhint %}

### 4. `get_job_status`

Owner-scoped: a job is visible only to the account that created it.

| Field    | What it does                                    | Required | Default |
| -------- | ----------------------------------------------- | -------- | ------- |
| `job_id` | The id returned by a `create_*` tool (UUID)     | Yes      | —       |
| `wait`   | Poll internally for up to 25 s before answering | No       | `false` |

Response shape:

```
{
  "job_id": "uuid",
  "status": "queued" | "processing" | "completed" | "failed",
  "created_at": "ISO-8601",
  "completed_at": "ISO-8601",   // only when status ∈ {completed, failed}
  "result": {                   // only when status = completed
    "url": "https://...",
    "export_url": "https://..." // only when the backend returns one
  },
  "error": {                    // only when status = failed
    "code": "UPSTREAM_FAILURE",
    "message": "human-readable reason"
  },
  "message": "…"                // only while queued / processing
}
```

## Responses and errors

A `create_*` tool returns the job descriptor; the download URL appears in `result.url` once `get_job_status` reports `completed`.

Every failure carries a user-facing message, a machine-readable code, and whether it is retryable. `rate_limited` can additionally carry `retry_after`, and upstream failures can carry a `request_id` for support.

| Code                    | Meaning                                                                    | Retryable |
| ----------------------- | -------------------------------------------------------------------------- | --------- |
| `invalid_input`         | A parameter failed validation, or the request was rejected upstream        | No        |
| `input_too_large`       | Source content exceeded the backend's token budget                         | No        |
| `file_too_large`        | Inline base64 file over 25 MB — attach it or use `file_url` instead        | No        |
| `unsupported_file_type` | Not a PDF/PPTX/DOCX/TXT, or content doesn't match the declared `mime_type` | No        |
| `credits_exhausted`     | Out of AI credits — upgrade the plan                                       | No        |
| `job_not_found`         | No job with that id for this account                                       | No        |
| `rate_limited`          | Too many requests. Carries `retry_after` when available                    | Yes       |
| `upstream_unavailable`  | The generation service is unreachable or returned an error                 | Yes       |
| `service_misconfigured` | Server-side auth problem between MCP and the backend                       | No        |
| `not_authenticated`     | The session carries no usable account email                                | No        |

**Authorization challenges** are returned as OAuth challenges rather than plain errors, which is what makes the MCP client prompt the user to reconnect: `invalid_token` (not connected, session expired, or the account email couldn't be resolved) and `insufficient_scope` (the connection lacks a permission a tool needs).

## Limits

| Limit                     | Value                                                                 |
| ------------------------- | --------------------------------------------------------------------- |
| Slides per presentation   | 1–50 (or `-1` for auto)                                               |
| `topic` length            | 450 characters                                                        |
| `text` length             | 2,000,000 characters at this layer; **665,000 tokens** at the backend |
| Inline `file_base64` size | 25 MB decoded                                                         |
| Attached / URL file size  | 100 MB                                                                |
| File download timeout     | 30 seconds                                                            |
| `wait: true` poll budget  | 25 seconds                                                            |
| Typical generation time   | 30–90 seconds                                                         |
| Sign-in session           | 7 days                                                                |
| Output formats            | `pptx`, `pdf`                                                         |

## Plans and billing

Which balance a generation is charged to depends on the plan — and, for Pro/Team, on whether the user ever issued an API key.

| Account                                    | Charged to                                                                      | Cost                                                |
| ------------------------------------------ | ------------------------------------------------------------------------------- | --------------------------------------------------- |
| Free / Starter                             | The account's AI-credit balance                                                 | **20 credits per generation** (any `create_*` tool) |
| Pro / Team **without** an API key          | A per-account daily quota                                                       | **100 generations per day** by default              |
| Pro / Team **with** an API key they issued | That key's daily limits — MCP usage shares the balance with their own API calls | per the key's limits                                |

An MCP connection **never creates an API key**. A Pro/Team user who has never issued one simply runs on the daily quota.

A brand-new account starts with **60 AI credits** — 3 generations before it needs an upgrade. When the balance is too low, the tool returns `credits_exhausted` with an upgrade link, and nothing is generated.

**Failed generations are refunded.** Credits and quota are reserved when the job is submitted and returned if it fails, so a crashed job costs nothing.

## Templates

Pass the exact id (case-sensitive, no spaces). All 51 built-in themes are available:

`Tokyo`, `NewYork`, `Seoul`, `Rome`, `Berlin`, `Copenhagen`, `Oslo`, `Rotterdam`, `Cambridge`, `Houston`, `Pasadena`, `Lisbon`, `MexicoCity`, `Doha`, `Vienna`, `Edinburgh`, `Toronto`, `Melbourne`, `Boston`, `SantaFe`, `FlowerMound`, `Tallinn`, `Porto`, `Dubai`, `BuenosAires`, `Seattle`, `Zurich`, `Reykjavik`, `Helsinki`, `Nairobi`, `Dublin`, `Oxford`, `Brussels`, `LosAngeles`, `Florence`, `Havana`, `TelAviv`, `Portland`, `Milan`, `Madrid`, `Singapore`, `Stockholm`, `Geneva`, `Chicago`, `HongKong`, `Tashkent`, `SanFrancisco`, `Batumi`, `PalmSprings`, `Paris`, `Marrakech`

Custom user-uploaded templates are **not** available over MCP.

## What you get

Each generated presentation includes:

* A title slide with an image
* An outline of the main points
* Content slides with images and text
* Professional formatting
* A permanent download link, delivered in the chat
* A file ready to edit in PowerPoint or Google Slides

## Limitations

* **Generation only.** There are no tools for editing, restyling, or appending to an existing presentation.
* **No custom templates** — only the 51 built-in themes.
* **No layout controls.** Layout selection is entirely up to the generation pipeline.
* **`pptx` and `pdf` only.**
* **One account per connection.** Switching Twistly accounts means reconnecting the connector.
* **7-day sessions.** After that the user signs in again.
* Free/Starter users can run out of credits mid-conversation. The tool says so explicitly, but partial work isn't refunded.

## FAQ

**Does the user need an API key?** No — that's the point of MCP. They sign in with an email, and MCP never issues a key.

**What if they've never used Twistly before?** It still works. The first generation creates a Free account for that email automatically, with 60 AI credits — 3 generations. Nothing to sign up for beforehand.

**Does this work on a Free Twistly plan?** Yes. Connector availability depends on the MCP *client's* plan and capabilities, not the Twistly plan.

**If a user already has a Twistly subscription, does MCP see it?** Yes, as long as they sign in with the same email. Their plan, balance, and history are the same account.

**How long is the download link valid?** It's permanent — the file stays in storage and the URL keeps working.

**Can the user attach a 60 MB PDF?** Yes, as a client attachment — attachments and URL files support up to 100 MB. Inline base64 is capped at 25 MB.

**What if the user asks for 80 slides?** The tool rejects it — the maximum is 50.

**Does the MCP server see the conversation?** No. It receives only the tool calls the client's model makes, with their parameters.

**Which languages are supported?** Any. The AI auto-detects from the input, or the user can pin it with `language`.

**Are the images copyrighted?** Unsplash and Pexels images are stock — credit photographers when sharing publicly. `flux` images are AI-generated and free to use.

**Which MCP clients can connect?** Any client that supports Streamable HTTP and standard OAuth discovery. ChatGPT is one supported client experience.

## Support

If something fails:

1. Disconnect and reconnect Twistly in the MCP client — this covers expired sessions and half-finished sign-ins.
2. Check the error code the tool returned. `credits_exhausted` and `rate_limited` reflect account state, not bugs.
3. Confirm the signed-in email is the account you expect to be billed.
4. For anything server-side, [contact us](/help/contact-us) with the `job_id` — every generation is logged against it.

## Next steps

* Connect Twistly in your MCP client and generate a first deck.
* Try all three inputs — a topic, pasted text, and an attached PDF — they produce noticeably different decks from the same source material.
* Mix `template`, `image_source`, and `presentation_type` to tune the output for an audience.


