POTX to TIFF API
POST /v2/convert/potx/to/tiff puts the visible slides of a PowerPoint template into one TIFF. At ImageResolution=96, our project review template came back as a 211,755-byte file with five 960 × 720 pages, each tagged 96 pixels per inch.
- Endpoint
- POST /v2/
convert/ potx/ to/ tiff - Accepts
- potx
- Sample timing
- 0.783 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/potx/to/tiff \
-H "Authorization: Bearer $PDFCONVERSIONAPI_KEY" \
-F File=@project-review.potx \
--form-string ImageResolution=96 \
-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/potx/to/tiff",
headers={"Authorization": f"Bearer {key}"},
files=[("File", open("project-review.potx", "rb"))],
data={
"ImageResolution": "96",
},
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 = "project-review.potx";
form.append("File", new Blob([await readFile(file)]), file);
form.append("ImageResolution", "96");
const url = "https://api.pdfconversionapi.com/v2/convert/potx/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.783,
"Files": [
{
"FileName": "project-review.tiff",
"FileExt": "tiff",
"FileSize": 211755,
"FileData": "SUkqAChyAABgAAAAAQAAAGAA…"
}
]
}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
- project-review.potx (43 KB)
- Output
- project-review.tiff (207 KB)
- Source
- A six-slide project review template for a fictional design studio, with bracketed text to replace and one hidden instructions 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 |
|---|---|
ImageResolutioninteger, default 150 | Drawing density and, when sent, the resolution tag on each page. 96 gives 960 × 720; the default 150 gives 1,500 × 1,125 pages in a 357,389-byte file.Values: 36–600 |
MultiPageboolean, default true | Leave it on: with false each slide comes back as its own uncompressed TIFF. |
PageRangestring | Slides to include. A single slide gives a single-page, uncompressed file: PageRange=1 at 150 DPI is 5,062,758 bytes.Values: e.g. 1-2 |
ConvertHiddenSlidesboolean, default false | Add the how-to slide; the TIFF then has 6 pages. |
ColorSpaceenum, default default | monochrome makes the pages pure black and white, stored with one channel: 8,468 bytes at 36 DPI, against 65,666 in color. gray gives 35,198 bytes, and rgb returns the same three-channel file as the default.Values: default, rgb, gray, monochrome |
ImageWidthinteger | Fixed page width in pixels.Values: 1–20,000 |
Passwordstring | Opens an encrypted template; 422 without it. |
FileNamestring | Name of the TIFF; project-review.tiff by default. |
Not supported yet
Setting one of these to anything but its default returns 400.
| Option | What to do instead |
|---|---|
ConvertSpeakerNotes | Notes don't appear on the pages; other values than Disabled return 400. |
PageSize | Each page has the 4:3 slide shape; PageSize returns 400. |
What carries over, and what doesn't
Kept
- The five visible slides in template order, in a single file
- LZW compression on every page
- The resolution you ask for, written to each page: 96 × 96 in the sample
- Master band, logo and footer on each page
Lost or not yet supported
- Compression on single-page results, from
MultiPage=falseor a one-slidePageRange. - Prompts of empty placeholders, speaker notes and the hidden slide (unless you ask for it).
- Cambria and Calibri, drawn with Caladea and Carlito.
Limits
- Up to 2,000 pages per request.
- 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; 512 MB per output file.
Where teams use it
Spotting changes between template versions
Render the old and the new .potx at the same ImageResolution and compare the TIFF pages with an image diff, slide by slide, before the new version replaces the old one.
Records that must be stored as TIFF
Where a records system takes TIFF only, the whole template goes in as one file with one page per slide.
Questions
Why did one slide come back as a huge file?
A TIFF of one page is not packed into the compressed multi-page format; it is written raw at 3 bytes per pixel. PageRange=1 at 150 DPI gave 5,062,758 bytes. Lower ImageResolution, or request two or more slides.
What resolution does the TIFF say it has?
The value you send: 96 in the sample. Leave ImageResolution out and pages are drawn at 150 pixels per inch and the resolution tag says only 1 × 1, with no unit.
Can I get a black-and-white TIFF?
ColorSpace=monochrome turns every pixel black or white and stores each page with a single gray channel, which cut the 36 DPI file from 65,666 to 8,468 bytes.
Convert your first POTX file in a minute.