POTX to WebP API
POST /v2/convert/potx/to/webp turns each visible slide of a template into a lossless WebP. ImageWidth=800 gave five 800 × 600 files for our project review template, from 9,514 bytes for the near-empty Next steps slide to 34,598 for the status table.
- Endpoint
- POST /v2/
convert/ potx/ to/ webp - Accepts
- potx
- Sample timing
- 0.846 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/webp \
-H "Authorization: Bearer $PDFCONVERSIONAPI_KEY" \
-F File=@project-review.potx \
--form-string ImageWidth=800 \
-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/webp",
headers={"Authorization": f"Bearer {key}"},
files=[("File", open("project-review.potx", "rb"))],
data={
"ImageWidth": "800",
},
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("ImageWidth", "800");
const url = "https://api.pdfconversionapi.com/v2/convert/potx/to/webp";
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.846,
"Files": [
{
"FileName": "project-review-1.webp",
"FileExt": "webp",
"FileSize": 17772,
"FileData": "UklGRmRFAABXRUJQVlA4TFhF…"
},
{
"FileName": "project-review-2.webp",
"FileExt": "webp",
"FileSize": 23210,
"FileData": "UklGRqJaAABXRUJQVlA4TJVa…"
},
{
"FileName": "project-review-3.webp",
"FileExt": "webp",
"FileSize": 34598,
"FileData": "UklGRh6HAABXRUJQVlA4TBGH…"
},
… 2 more files
]
}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-1.webp (17 KB)project-review-2.webp (23 KB)project-review-3.webp (34 KB)project-review-4.webp (26 KB)project-review-5.webp (9.3 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 |
|---|---|
ImageWidthinteger | Exact width; 800 gives 800 × 600 for the 4:3 template.Values: 1–20,000 |
ImageHeightinteger | Exact height; width follows the slide.Values: 1–20,000 |
ImageResolutioninteger, default 150 | Pixels per inch when no size is given: 1,500 × 1,125, 218,614 bytes for the five slides. WebP doesn't store a DPI.Values: 36–600 |
PageRangestring | Which visible slides, for example 2-3 for the agenda and the table.Values: e.g. 2-3 |
ConvertHiddenSlidesboolean, default false | Include the hidden how-to slide as image 5. |
TransparentColorstring | One exact color made transparent, such as white for the slide background. |
Passwordstring | Needed when the template is encrypted; 422 otherwise. |
FileNamestring | Stem of the names, before -1.webp and the rest. |
Not supported yet
Setting one of these to anything but its default returns 400.
| Option | What to do instead |
|---|---|
ImageQuality | Lossless output has no quality setting. Values other than 75 return 400 "ImageQuality is not supported yet for POTX → WebP". |
ConvertSpeakerNotes | Notes are not drawn; values other than Disabled return 400. |
What carries over, and what doesn't
Kept
- Exact pixels: lossless WebP, so lines in the table and chart have no artifacts
- The band, logo and footer from the slide master
- The colored status cells and both chart series
- No alpha channel until you key a color out with
TransparentColor
Lost or not yet supported
- Any lossy saving: there is no quality knob, so photo-heavy templates stay bigger than lossy WebP would be.
- The DPI, which WebP can't record.
- Caladea and Carlito stand in for Cambria and Calibri.
- Speaker notes and the hidden slide, by default.
Limits
- 2,000 slides per request.
- 16,000 pixels per side and 100 million per image.
- 10 MB on the Free plan or 100 MB on paid plans per request; 120 seconds per conversion.
Where teams use it
Template galleries on a website
Show every slide of each template at 800 pixels wide. For our sample that is 111,766 bytes of images per template, with no compression marks on the small footer text.
Previews stored next to each .potx
Keep a WebP per slide beside the template in your file store, and regenerate them when the template file changes.
Questions
How much smaller is WebP than PNG here?
At 800 × 600 the five slides take 111,766 bytes as WebP and 226,998 as PNG, with identical pixels. The emptiest slide, Next steps, is 9,514 bytes as WebP.
Can I make the WebP files lossy to save more?
Not yet: ImageQuality returns 400 for any value but 75. For lossy files, ask for JPEG at /v2/convert/potx/to/jpg.
Why is the Next steps image almost empty?
Its body placeholder was left empty in the template. The prompt "Add up to five points, one line each" only appears while editing, so the image shows the title, band, footer and logo.
Convert your first POTX file in a minute.