PPSX to TIFF API
POST /v2/convert/ppsx/to/tiff returns a single TIFF holding every slide the show plays, as ConvertAPI does by default. At ImageResolution=100 our museum loop became one 295,972-byte file with five 1,333 × 750 pages, each tagged 100 pixels per inch.
- Endpoint
- POST /v2/
convert/ ppsx/ to/ tiff - Accepts
- ppsx
- Sample timing
- 0.77 s median of 5 runsHow we measure
- Request size
- Up to 10 MB on the Free plan or 100 MB on paid plans, all files together
Request and response
Every sample below ran against the API before this page was published. Set PDFCONVERSIONAPI_KEY to your key and run it as is.
curl -sS -X POST \
https://api.pdfconversionapi.com/v2/convert/ppsx/to/tiff \
-H "Authorization: Bearer $PDFCONVERSIONAPI_KEY" \
-F File=@pilot-house-welcome.ppsx \
--form-string ImageResolution=100 \
-o response.json
# FileData is base64. Save the first file in converted/,
# or print the JSON error.
if jq -e '.Files' response.json > /dev/null; then
mkdir -p converted
name=$(jq -r '.Files[0].FileName' response.json)
jq -r '.Files[0].FileData' response.json \
| base64 --decode > "converted/$name"
else
cat response.json
fiimport base64
import os
import requests
key = os.environ["PDFCONVERSIONAPI_KEY"]
response = requests.post(
"https://api.pdfconversionapi.com/v2/convert/ppsx/to/tiff",
headers={"Authorization": f"Bearer {key}"},
files=[("File", open("pilot-house-welcome.ppsx", "rb"))],
data={
"ImageResolution": "100",
},
timeout=180,
)
result = response.json()
if not response.ok:
raise SystemExit(f"{result['Code']}: {result['Message']}")
os.makedirs("converted", exist_ok=True)
for file in result["Files"]:
path = os.path.join("converted", file["FileName"])
with open(path, "wb") as out:
out.write(base64.b64decode(file["FileData"]))
print(path, file["FileSize"], "bytes")
import { mkdir, readFile, writeFile } from "node:fs/promises";
import { join } from "node:path";
const form = new FormData();
const file = "pilot-house-welcome.ppsx";
form.append("File", new Blob([await readFile(file)]), file);
form.append("ImageResolution", "100");
const url = "https://api.pdfconversionapi.com/v2/convert/ppsx/to/tiff";
const key = process.env.PDFCONVERSIONAPI_KEY;
const response = await fetch(url, {
method: "POST",
headers: { Authorization: `Bearer ${key}` },
body: form,
});
const result = await response.json();
if (!response.ok) {
throw new Error(`${result.Code}: ${result.Message}`);
}
await mkdir("converted", { recursive: true });
for (const file of result.Files) {
const path = join("converted", file.FileName);
await writeFile(path, Buffer.from(file.FileData, "base64"));
console.log(path, file.FileSize, "bytes");
}
{
"ConversionCost": 1,
"ConversionTime": 0.77,
"Files": [
{
"FileName": "pilot-house-welcome.tiff",
"FileExt": "tiff",
"FileSize": 295972,
"FileData": "SUkqANfWAABkAAAAAQAAAGQA…"
}
]
}Response from our test run on 2026-11-03. ConversionTime shows the median of 5 runs. FileData is shortened here; the real response carries the whole file as base64.
The sample, converted
The same file the code sends. Download the input and the output and compare them yourself.

- Input
- pilot-house-welcome.ppsx (46 KB)
- Output
- pilot-house-welcome.tiff (289 KB)
- Source
- A six-slide welcome loop for a fictional harbor museum, set to advance by itself, with one hidden staff slide. We made it for this page. (CC0-1.0). How it was made
- Made by
- 2026-11-04, API build
9eeeb0640aba
Parameters
Send these as form fields next to the file. Names are case-insensitive. If you set one of the documented options below that we don't support yet, the request fails with a 400 that names it instead of returning a file made without it.
| Parameter | What it does |
|---|---|
MultiPageboolean, default true | false returns one TIFF per slide instead, and those are written without compression: 6,746,891 bytes each at 150 DPI, while all five pages in one file take 483,522. |
ImageResolutioninteger, default 150 | Pixel density of every page, and the resolution tag when you send it. 150 gives 1,999 × 1,125 pages whose tag says only 1 × 1, with no unit; 100 gives 1,333 × 750 tagged 100 × 100.Values: 36–600 |
PageRangestring | Slides to include, counted without hidden ones. 2-3 gave a two-page TIFF of 195,938 bytes. A range of a single slide returns a one-page, uncompressed file.Values: e.g. 2-3 |
ImageWidthinteger | Exact page width, height in proportion.Values: 1–20,000 |
ConvertHiddenSlidesboolean, default false | Add hidden slides as pages; the sample's TIFF then has 6 pages. |
Passwordstring | Password of a protected show; a locked file without it returns 422. |
FileNamestring | Name of the TIFF: pilot-house-welcome.tiff by default. |
StoreFileboolean, default false | Link to the stored TIFF in place of the data, valid for 3 hours. |
Not supported yet
Setting one of these to anything but its default returns 400.
| Option | What to do instead |
|---|---|
ConvertSpeakerNotes | Notes are not printed on the pages; other values than Disabled return 400. |
PageSize | Pages have the slide's 16:9 shape; PageSize returns 400. |
What carries over, and what doesn't
Kept
- All slides the show plays, in order, in one file
- LZW compression on every page of the multi-page file
- The resolution you send, written into each page: 100 × 100 pixels per inch in the sample
- Red, green and blue at 8 bits each on every page, with no alpha channel
Lost or not yet supported
- Compression, whenever the result is single pages: with
MultiPage=false, or with a range of one slide. - The fade and the 8-second timing; TIFF pages are stills.
- The speaker note and the hidden staff slide, unless you ask for hidden slides.
- Calibri, which is drawn as Carlito with the same widths.
Limits
- 2,000 pages per request at most.
- 16,000 pixels per side and 100 million pixels per page.
- 10 MB on the Free plan or 100 MB on paid plans per request; 120 seconds per conversion; each output file up to 512 MB.
Where teams use it
Filing a show in a TIFF-based archive
Document and records systems that store TIFF can take the whole loop as one item, one page per slide, instead of a .ppsx they can't preview.
Comparing two versions of a loop
Render last month's and this month's show at the same ImageResolution and compare the pages pixel by pixel to see exactly which slides changed.
Questions
Why are separate TIFF files so much bigger?
The multi-page file is LZW-compressed; single-page files are stored raw at 3 bytes per pixel. At 150 DPI one raw slide is 6,746,891 bytes, more than the whole 5-page compressed TIFF (483,522). Keep MultiPage on, or lower ImageResolution.
What DPI does the TIFF report?
Only the one you send. The sample, sent with ImageResolution=100, reports 100 × 100 pixels per inch. Without the option, pages are drawn at 150 pixels per inch and the resolution tag says only 1 × 1, with no unit.
How many pages will the TIFF have?
One per slide the show plays: 5 for the sample. ConvertHiddenSlides=true adds the staff slide for 6, and PageRange narrows it.
Convert your first PPSX file in a minute.