# PowerPoint Generator: Markdown or JSON to PPTX & PDF Slides (`jumblemog/pptx-deck-builder`) Actor

Make editable PowerPoint decks from Markdown or JSON: native charts, styled tables, KPI tiles, images, two columns, quotes and speaker notes, in a built-in theme or your own .pptx/.potx template. Get the .pptx, its PDF and pictures of the slides.

- **URL**: https://apify.com/jumblemog/pptx-deck-builder.md
- **Developed by:** [Jumble Mog](https://apify.com/jumblemog) (community)
- **Categories:** AI, Automation, Developer tools
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## PowerPoint Generator: Markdown or JSON to PPTX & PDF Slides

**Turn Markdown or a JSON list of slides into a real, editable PowerPoint deck.** Write a `##` heading per slide and get back a .pptx with proper title and body text, native charts you can edit in PowerPoint, styled tables, KPI tiles, images, two-column slides, quotes and speaker notes. You also get its PDF and pictures of the slides. Use one of four built-in themes, or your company's own .pptx or .potx template.

- **Editable, not pictures.** Titles and bullets are real PowerPoint text. Charts are native PowerPoint charts with their data inside (right-click, Edit Data), and tables are real tables. Anyone can open the deck and keep working on it.
- **Your template.** Give a link to your company's template, or any deck in its style. The slides use its masters, layouts, fonts and colors, and its own example slides are left out.
- **Charts from a few lines.** Column, bar, line, pie, doughnut, area and scatter charts, plus stacked column, bar and area and 100% column and bar. Data comes as CSV inside the Markdown or as JSON, with number formats, data labels and axis titles.
- **Made to fit.** Long text gets a smaller font, and slides with too many bullets or table rows carry on to a "(continued)" slide. KPI values are sized to their tiles.
- **PDF and previews.** Every deck also comes as a PDF, with an overview picture of the first slides. Optionally there's a PNG of each slide, to check the layout or show a preview.

It's made for:

- AI agents and chat assistants asked to "make me a deck": they write Markdown or JSON, and the user gets a real .pptx back instead of a wall of text.
- Reports that become slides every week or month, such as a business review, a client report or a sprint summary, generated from your data in your company template.
- Apps and no-code flows (Zapier, Make, n8n) that turn a form, a spreadsheet row or a database record into a proposal, a quote deck or a training deck.
- Anyone who'd rather write an outline than push boxes around in PowerPoint.

![A Markdown outline with a title, bullets with speaker notes, KPI numbers and a chart block, next to the PowerPoint deck it makes: a title slide, bullets, four KPI tiles, a native column chart, a styled table and a two-column slide](https://api.apify.com/v2/key-value-stores/Km5b4PG3kYHdZSb1E/records/pptx-deck-builder-example.png?signature=1oeTtnjopgt4GP1uhMVwd)

### How to use it

1. Write the slides in **Markdown** (the input form has an example to start from), or give them as **JSON**.
2. Pick a **theme**, or give your **template** as a link or an upload. Add a footer, brand colors or a presenter name if you like.
3. Click **Start**. You get a link to the .pptx, the PDF and an overview picture of the slides.

#### Writing slides in Markdown

````markdown
## Q3 2026 Business Review
Northwind Studio · prepared for the board

### Highlights
- Revenue grew **18%** year over year to $4.2M
- Gross margin up 3 points to 61%
  - Mostly from lower hosting costs

Notes: Open with the revenue number.

### Key numbers
```stats
$4.2M | Revenue
61% | Gross margin
```

### Revenue by quarter ($M)
```chart
type: column
format: 0.0
dataLabels: true
Quarter,2025,2026
Q1,2.9,3.4
Q2,3.1,3.8
Q3,3.6,4.2
```
````

| Write | Makes |
|---|---|
| `# Title` and a line under it | The title slide, with that line as the subtitle (a later `#` makes a section slide). |
| `## Heading` or `---` | A new slide. |
| `- point` (indent for sub-points), plain lines | Bullets, or paragraphs. `**bold**`, `*italic*`, `` `code` `` and `[links](https://...)` work. |
| A pipe table (`\| a \| b \|`) | A table. Number columns are right-aligned. |
| ` ```chart ` with `type:`, `title:`, `format:`, `dataLabels:` lines, then CSV | A native chart: the first column is the categories, each other column a series. |
| ` ```stats ` with `value \| label` lines | KPI tiles (up to 8). |
| `![caption](https://.../photo.jpg)` | An image, fitted to the slide, with its caption. |
| `> quote` and `> — Name` | A quote slide. |
| `\|\|\|` on its own line | Splits the slide into two columns; a `###` heading above each column titles it. |
| `Notes: ...` or `<!-- ... -->` | Speaker notes. |

#### Slides as JSON

```json
{
  "slides": [
    {"title": "Launch plan", "subtitle": "Spring release"},
    {"title": "Signups by channel", "chart": {"type": "bar", "categories": ["Search", "Social", "Email"],
                                              "series": [{"name": "Signups", "values": [420, 310, 150]}]},
     "notes": "Search is still the biggest channel."},
    {"title": "Targets", "stats": [{"value": "10k", "label": "Signups"}, {"value": "4%", "label": "Paid"}]},
    {"title": "Before and after", "leftTitle": "Today", "left": ["Manual onboarding", "6 weeks"],
     "rightTitle": "After launch", "right": ["Self-serve", "2 days"]}
  ],
  "theme": "midnight"
}
```

A slide has a `title` and one of these:

- `bullets`: nested lists for sub-points;
- `text`;
- `table`: rows of objects, or `{"header", "rows"}`;
- `chart`: `type`, `categories`, `series` and optional `title`, `numberFormat`, `dataLabels`, `legend`, `xTitle`, `yTitle`;
- `image`: a link and an optional `caption`;
- `stats`: a list of `{"value", "label"}`.

Slides can also have `notes`. Other slide shapes:

- `{"left", "right"}` (each bullets, text or any of the blocks above, with optional `leftTitle` and `rightTitle`) makes two columns;
- `{"quote", "author"}` makes a quote slide;
- `{"layout": "section"}` makes a divider.

#### Options

| Field | What it takes |
|---|---|
| `markdown` or `slides` | The slides. |
| `title`, `subtitle`, `author`, `date` | Add a title slide when the slides don't start with one; `author` is also saved in the file. |
| `theme` | `clean` (white and blue), `midnight` (dark), `sand` (warm) or `slate` (cool). |
| `template` | A link to a .pptx or .potx (Google Drive, Dropbox and OneDrive share links work), base64, or an upload in `uploads`. |
| `colors` | Up to 6 hex colors for accents, charts and tables, replacing the theme's or the template's. |
| `aspect` | `16:9` (default) or `4:3`, for the built-in themes. |
| `slideNumbers`, `footer` | Slide numbers (on by default) and a footer line on every slide but the title slide. |
| `outputs` | `["pptx", "pdf"]` (default), or one of them. |
| `slideImages` | `true` also saves a PNG of each slide (the first 30). |
| `fileName` | The files' name. By default the deck's title. |
| `requests` | More decks in one run (up to 20). Each is Markdown text, a list of slides, or an object with the fields above. |

### How-to examples

Each example below is a complete input. The result line is what the run says in `summary`.

#### How to convert Markdown to PowerPoint (PPTX)

```json
{"markdown": "# Weekly update\nProduct team · week 43\n\n## Done\n- Shipped search\n- Fixed 12 bugs\n\n## Next\n- Billing page\n- Onboarding emails\n\nNotes: Ask for two more testers.", "theme": "slate"}
```

Result: "Made Weekly update: 3 slides in the slate theme, speaker notes on 1, as PPTX and PDF." You get `pptxUrl`, `pdfUrl` and an overview picture.

#### How to turn spreadsheet data into chart and table slides

Send the numbers as JSON. The chart is a native PowerPoint chart, so it can still be edited in PowerPoint.

```json
{
  "title": "Acme Co. monthly report", "date": "August 2026", "outputs": ["pptx"],
  "slides": [
    {"title": "Leads by month", "chart": {"type": "line", "categories": ["Jun", "Jul", "Aug"],
                                          "series": [{"name": "Leads", "values": [362, 410, 488]}], "yTitle": "Leads"}},
    {"title": "The numbers", "table": [{"Month": "Jun", "Visits": 16900, "Leads": 362},
                                       {"Month": "Jul", "Visits": 18200, "Leads": 410},
                                       {"Month": "Aug", "Visits": 21400, "Leads": 488}]}
  ]
}
```

Result: "Made Acme Co. monthly report: 3 slides in the clean theme, 1 chart, 1 table, as PPTX." The title slide is added from `title` and `date`.

#### How to make slides in your company's PowerPoint template

Add `"template"` with a link to your .pptx or .potx (a Google Drive, Dropbox or OneDrive share link works), and leave out `theme`:

```json
{"template": "https://example.com/brand-template.potx", "markdown": "# Atlas Freight onboarding plan\n\n## Week 1\n- Kickoff call\n- Data import", "outputs": ["pptx"]}
```

Result: "Made Atlas Freight onboarding plan: 2 slides in the template, as PPTX." The slides use the template's layouts, fonts, colors and master graphics.

#### How to let ChatGPT, Claude or another AI agent make PowerPoint decks

Add this Actor to the [Apify MCP server](https://mcp.apify.com) with `https://mcp.apify.com/?tools=jumblemog/pptx-deck-builder`. The agent writes the deck as Markdown, sends it in `markdown`, and gives the user the `pptxUrl` link. The `outline` in the result lists every slide, so the agent can check the deck without opening it.

### FAQ

**Is the PowerPoint editable?** Yes. Titles, bullets and tables are real PowerPoint text and tables, and charts are native charts with their data inside (right-click, Edit Data).

**Can I use my own template?** Yes, any .pptx or .potx. Its example slides are left out and its layouts are used for the new slides.

**Does it work with Zapier, Make or n8n?** Yes. Call the Actor with its Apify app or an HTTP request, and pass the Markdown or slides from an earlier step.

**Can I get a PDF too?** Yes. A PDF is made by default; set `outputs` to `["pptx"]` or `["pdf"]` for one of them.

**Does it make Google Slides?** It makes a .pptx file, which Google Slides opens and converts (File > Import slides, or upload it to Drive).

### Output

There is one dataset item per deck. They are also saved together in the run's `OUTPUT` record:

```json
{
  "request": 1, "status": "ok", "type": "deck", "title": "Q3 2026 Business Review",
  "summary": "Made Q3 2026 Business Review: 8 slides in the clean theme, 1 chart, 1 table, speaker notes on 1, as PPTX and PDF.",
  "slides": 8, "pages": 8, "theme": "clean", "template": false, "aspect": "16:9",
  "pptxUrl": "https://api.apify.com/v2/key-value-stores/.../records/001-Q3-2026-Business-Review.pptx",
  "pdfUrl": "https://api.apify.com/v2/key-value-stores/.../records/001-Q3-2026-Business-Review.pdf",
  "imageUrl": "https://api.apify.com/v2/key-value-stores/.../records/001-Q3-2026-Business-Review-overview.png",
  "slideImageUrls": [],
  "outline": [{"slide": 4, "kind": "content", "title": "Revenue by quarter ($M)", "content": "column chart, 2 series", "notes": false}],
  "warnings": []
}
```

Each item also has the slide-by-slide `outline` and a Markdown `report`. It has `warnings` for anything to check, such as an image that couldn't be loaded (its caption is shown in its place, and the deck is still made). A request that can't be read gives `"status": "failed"`, with an `error` that says what to change. Failed requests aren't billed.

### How it works

1. **Reading the slides.** The Markdown or JSON is read into slides, each with a title and one kind of content (or two columns). Lists that are too long for a slide carry on to the next.
2. **Laying them out.** [python-pptx](https://python-pptx.readthedocs.io/) builds the deck.
   - In a built-in theme, the deck's own theme colors are set too, so new slides and charts added in PowerPoint match.
   - In your template, each slide uses the matching layout (title, section, title and content, two content) and its placeholders, so the template's fonts, positions and master graphics apply.
   - Charts are native chart objects with their data in an embedded workbook.
3. **PDF and pictures.** [LibreOffice](https://www.libreoffice.org/) Impress makes the PDF, and [PDFium](https://pdfium.googlesource.com/pdfium/) draws the slide pictures from it.

### Pricing

You pay one low price per deck, at the price shown on this page. The PDF, the overview picture and the slide pictures are included. Failed requests are never charged. If you set a maximum cost per run, the Actor makes only the decks that fit.

### Speed

A 10-slide deck with a chart and a table takes about 2 seconds, PDF included. A run through the API answers in about 10 to 15 seconds for one deck, which includes starting the cloud container and LibreOffice.

### Tips and limits

- **Templates.** Any .pptx or .potx works. Decks made in a template follow its layouts, so a template whose layouts have the usual Title, Section Header, Title and Content and Two Content placeholders looks best. Brand colors in `colors` replace its accent colors. The PDF and pictures are drawn by LibreOffice, so fonts the template uses but the server doesn't have are replaced by look-alikes. The .pptx keeps the real font names and shows them on your computer.
- **Images.** PNG, JPEG, GIF and BMP go in as they are. WebP and TIFF are converted to PNG. SVG isn't supported, so convert it to PNG first.
- **Limits:**
  - 20 decks per run;
  - 200 slides per deck;
  - 200 rows per table (split into slides of 14 rows);
  - 12 bullets per slide before it continues;
  - 50 images per deck, 50 MB per file.

### For AI agents and developers

This Actor works with the [Apify MCP server](https://mcp.apify.com), so AI agents can call it as a tool. Write the deck as Markdown, send it in `markdown`, and give the user `pptxUrl` (and `pdfUrl` to preview).

A direct API call that waits for the answer:

```bash
curl -X POST "https://api.apify.com/v2/acts/jumblemog~pptx-deck-builder/run-sync-get-dataset-items?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"markdown": "# Weekly update\n\n## Done\n- Shipped search\n- Fixed 12 bugs\n\n## Next\n- Billing page", "theme": "slate"}'
```

`run-sync` returns the run's `OUTPUT` instead: the status, the counts and every result as JSON.

In Python, with the `apify-client` package, here's a client report made from data, in your company template:

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_TOKEN")
rows = [{"Month": "Jul", "Visits": 18200, "Leads": 410}, {"Month": "Aug", "Visits": 21400, "Leads": 488}]
run = client.actor("jumblemog/pptx-deck-builder").call(run_input={
    "template": "https://example.com/brand-template.potx",
    "title": "Acme Co. monthly report", "date": "August 2026",
    "slides": [
        {"title": "Traffic and leads", "chart": {"type": "line", "categories": [r["Month"] for r in rows],
                                                 "series": [{"name": "Leads", "values": [r["Leads"] for r in rows]}]}},
        {"title": "The numbers", "table": rows},
    ],
})
item = next(client.dataset(run["defaultDatasetId"]).iterate_items())
print(item["pptxUrl"], item["pdfUrl"])
```

### Credits

- [python-pptx](https://python-pptx.readthedocs.io/) (MIT) writes the PowerPoint files.
- [LibreOffice](https://www.libreoffice.org/) (MPL-2.0) Impress makes the PDFs.
- [pypdfium2](https://github.com/pypdfium2-team/pypdfium2) (Apache-2.0 or BSD-3-Clause) and [Pillow](https://python-pillow.org/) (MIT-CMU) draw the slide pictures.
- The Carlito, Caladea and Liberation fonts (SIL Open Font License) give text the widths of Calibri, Cambria and Arial.

# Actor input Schema

## `markdown` (type: `string`):

One slide per ## heading (or ---). A # heading makes the title slide (first) or a section slide. Bullets (indent for sub-points), **bold**, *italic*, `code` and links; pipe tables; !\[caption]\(image link); > quotes with — author; ||| splits a slide into two columns. `chart blocks (type: column, then CSV) make native charts and `stats blocks (value | label lines) make KPI tiles. A line starting Notes: becomes the speaker notes.

## `slides` (type: `array`):

A list of slides, each {"title", and one of "bullets" (nested lists for sub-points), "text", "table" (rows of objects, or {"header", "rows"}), "chart" ({"type": column, bar, line, pie, doughnut, area, scatter, stackedColumn, stackedBar, percentColumn..., "categories", "series": \[{"name", "values"}]}), "image" (a link) or "stats" (\[{"value", "label"}]), plus "notes"}. {"left", "right"} makes two columns; {"quote", "author"} a quote slide; {"layout": "section"} a divider.

## `title` (type: `string`):

Adds a title slide with this title when the slides don't start with one, and names the files.

## `subtitle` (type: `string`):

The title slide's subtitle.

## `author` (type: `string`):

Shown on the title slide and saved as the file's author.

## `date` (type: `string`):

Shown on the title slide, as typed.

## `theme` (type: `string`):

The built-in look, used when no template is given.

## `template` (type: `string`):

A link to your company's PowerPoint template or any deck in its style: the slides use its masters, layouts, fonts and colors (its own slides are left out). Google Drive, Dropbox and OneDrive share links work; base64 too.

## `uploads` (type: `array`):

Upload one .pptx or .potx from your computer, or pick one already in an Apify key-value store.

## `colors` (type: `array`):

Up to 6 hex colors ("#0B5FFF") for accents, charts and tables, in order; they replace the theme's or template's accent colors.

## `aspect` (type: `string`):

For the built-in themes; a template keeps its own size.

## `slideNumbers` (type: `boolean`):

Number every slide but the title slide.

## `footer` (type: `string`):

Text at the bottom of every slide but the title slide, such as "Confidential".

## `outputs` (type: `array`):

The files to save. An overview picture of the first slides is always made.

## `slideImages` (type: `boolean`):

Also save a PNG of each slide (the first 30), for previews or to check the layout.

## `fileName` (type: `string`):

Without the extension. By default the deck's title.

## `requests` (type: `array`):

More decks in one run: each entry is Markdown text, a list of slides, or an object with "markdown" or "slides" and any of the fields above. The look and output fields above apply to each unless it sets its own. Up to 20.

## Actor input object example

````json
{
  "markdown": "# Q3 2026 Business Review\nNorthwind Studio · prepared for the board\n\n## Highlights\n- Revenue grew **18%** year over year to $4.2M\n- Two new enterprise clients: Blue Fern Cafe and Atlas Freight\n- Gross margin up 3 points to 61%\n  - Mostly from lower hosting costs\n- Hired 4 engineers and 1 designer\n\nNotes: Open with the revenue number, then the two client wins.\n\n## Key numbers\n```stats\n$4.2M | Revenue\n61% | Gross margin\n118% | Net revenue retention\n42 | Customers\n```\n\n## Revenue by quarter ($M)\n```chart\ntype: column\nformat: 0.0\ndataLabels: true\nQuarter,2025,2026\nQ1,2.9,3.4\nQ2,3.1,3.8\nQ3,3.6,4.2\n```\n\n## Pipeline\n| Stage | Deals | Value |\n|---|---|---|\n| Qualified | 34 | $2.1M |\n| Proposal | 12 | $1.4M |\n| Negotiation | 5 | $0.9M |\n| Closed won | 9 | $1.2M |\n\n## What went well, what to fix\n### Went well\n- Enterprise deals closed in 41 days, down from 63\n- Churn fell to 0.8% a month\n|||\n### To fix\n- Onboarding still takes 6 weeks\n- Support backlog doubled in August\n\n---\n> The question is not whether we grow, but how fast we can hire.\n> — Ana Lee, CEO\n\n# Next steps\nHire, ship onboarding v2, open the Chicago office\n",
  "theme": "clean",
  "aspect": "16:9",
  "slideNumbers": true,
  "outputs": [
    "pptx",
    "pdf"
  ],
  "slideImages": false
}
````

# Actor output Schema

## `results` (type: `string`):

One row per deck: the summary and links to the .pptx, PDF and overview picture.

## `output` (type: `string`):

The OUTPUT record: every result in one JSON object.

## `files` (type: `string`):

The decks (.pptx), their PDFs and slide pictures in the run's key-value store.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

````javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "markdown": `# Q3 2026 Business Review
Northwind Studio · prepared for the board

## Highlights
- Revenue grew **18%** year over year to $4.2M
- Two new enterprise clients: Blue Fern Cafe and Atlas Freight
- Gross margin up 3 points to 61%
  - Mostly from lower hosting costs
- Hired 4 engineers and 1 designer

Notes: Open with the revenue number, then the two client wins.

## Key numbers
```stats
$4.2M | Revenue
61% | Gross margin
118% | Net revenue retention
42 | Customers
````

## Revenue by quarter ($M)

```chart
type: column
format: 0.0
dataLabels: true
Quarter,2025,2026
Q1,2.9,3.4
Q2,3.1,3.8
Q3,3.6,4.2
```

## Pipeline

| Stage | Deals | Value |
|---|---|---|
| Qualified | 34 | $2.1M |
| Proposal | 12 | $1.4M |
| Negotiation | 5 | $0.9M |
| Closed won | 9 | $1.2M |

## What went well, what to fix

### Went well

- Enterprise deals closed in 41 days, down from 63
- Churn fell to 0.8% a month
  |||

### To fix

- Onboarding still takes 6 weeks
- Support backlog doubled in August

***

> The question is not whether we grow, but how fast we can hire.
> — Ana Lee, CEO

# Next steps

Hire, ship onboarding v2, open the Chicago office\`
};

// Run the Actor and wait for it to finish
const run = await client.actor("jumblemog/pptx-deck-builder").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

````

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "markdown": """# Q3 2026 Business Review
Northwind Studio · prepared for the board

## Highlights
- Revenue grew **18%** year over year to $4.2M
- Two new enterprise clients: Blue Fern Cafe and Atlas Freight
- Gross margin up 3 points to 61%
  - Mostly from lower hosting costs
- Hired 4 engineers and 1 designer

Notes: Open with the revenue number, then the two client wins.

## Key numbers
```stats
$4.2M | Revenue
61% | Gross margin
118% | Net revenue retention
42 | Customers
````

## Revenue by quarter ($M)

```chart
type: column
format: 0.0
dataLabels: true
Quarter,2025,2026
Q1,2.9,3.4
Q2,3.1,3.8
Q3,3.6,4.2
```

## Pipeline

| Stage | Deals | Value |
|---|---|---|
| Qualified | 34 | $2.1M |
| Proposal | 12 | $1.4M |
| Negotiation | 5 | $0.9M |
| Closed won | 9 | $1.2M |

## What went well, what to fix

### Went well

- Enterprise deals closed in 41 days, down from 63
- Churn fell to 0.8% a month
  |||

### To fix

- Onboarding still takes 6 weeks
- Support backlog doubled in August

***

> The question is not whether we grow, but how fast we can hire.
> — Ana Lee, CEO

# Next steps

Hire, ship onboarding v2, open the Chicago office
""" }

# Run the Actor and wait for it to finish

run = client.actor("jumblemog/pptx-deck-builder").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)

print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

````

## CLI example

```bash
echo '{
  "markdown": "# Q3 2026 Business Review\\nNorthwind Studio · prepared for the board\\n\\n## Highlights\\n- Revenue grew **18%** year over year to $4.2M\\n- Two new enterprise clients: Blue Fern Cafe and Atlas Freight\\n- Gross margin up 3 points to 61%\\n  - Mostly from lower hosting costs\\n- Hired 4 engineers and 1 designer\\n\\nNotes: Open with the revenue number, then the two client wins.\\n\\n## Key numbers\\n```stats\\n$4.2M | Revenue\\n61% | Gross margin\\n118% | Net revenue retention\\n42 | Customers\\n```\\n\\n## Revenue by quarter ($M)\\n```chart\\ntype: column\\nformat: 0.0\\ndataLabels: true\\nQuarter,2025,2026\\nQ1,2.9,3.4\\nQ2,3.1,3.8\\nQ3,3.6,4.2\\n```\\n\\n## Pipeline\\n| Stage | Deals | Value |\\n|---|---|---|\\n| Qualified | 34 | $2.1M |\\n| Proposal | 12 | $1.4M |\\n| Negotiation | 5 | $0.9M |\\n| Closed won | 9 | $1.2M |\\n\\n## What went well, what to fix\\n### Went well\\n- Enterprise deals closed in 41 days, down from 63\\n- Churn fell to 0.8% a month\\n|||\\n### To fix\\n- Onboarding still takes 6 weeks\\n- Support backlog doubled in August\\n\\n---\\n> The question is not whether we grow, but how fast we can hire.\\n> — Ana Lee, CEO\\n\\n# Next steps\\nHire, ship onboarding v2, open the Chicago office\\n"
}' |
apify call jumblemog/pptx-deck-builder --silent --output-dataset

````

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,jumblemog/pptx-deck-builder"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/MSBDzgABdkhwdhye1/builds/6UGsk5R9F4nXGgJqs/openapi.json
